J'essaie de créer un programme qui lira une chaîne JSON via l'interface graphique, puis l'utiliser pour effectuer des fonctions supplémentaires, dans ce cas, décomposer une équation mathématique. En ce moment, je reçois l'erreur:
"TypeError: les indices de chaîne doivent être des entiers"
et je ne sais pas pourquoi.
Le JSON que j'essaie de lire est le suivant:
{
"rightArgument":{
"cell":"C18",
"value":9.5,
"type":"cell"
},
"leftArgument":{
"rightArgument":{
"cell":"C3",
"value":135,
"type":"cell"
},
"leftArgument":{
"rightArgument":{
"cell":"C4",
"value":125,
"type":"cell"
},
"leftArgument":{
"cell":"C5",
"value":106,
"type":"cell"
},
"type":"operation",
"operator":"*"
},
"type":"operation",
"operator":"+"
},
"type":"operation",
"operator":"+"
}
import json
import tkinter
from tkinter import *
data = ""
list = []
def readText():
mtext=""
mtext = strJson.get()
mlabel2 = Label(myGui,text=mtext).place(x=180,y=200)
data = mtext
def mhello():
_getCurrentOperator(data)
def _getCurrentOperator(data):
if data["type"] == "operation":
_getCurrentOperator(data["rightArgument"])
_getCurrentOperator(data["leftArgument"])
list.append(data["operator"])
Elif data["type"] == "group":
_getCurrentOperator(data["argument"])
Elif data["type"] == "function":
list.append(data["name"]) # TODO do something with arguments
for i in range(len(data["arguments"])):
_getCurrentOperator(data["arguments"][i])
else:
if (data["value"]) == '':
list.append(data["cell"])
else:
list.append(data["value"])
print(list)
myGui = Tk()
strJson = StringVar()
myGui.title("Simple Gui")
myGui.geometry("400x300")
label = Label(text = 'Welcome!').place(x=170,y=40)
btnStart = Button(myGui,text='Start',command=mhello).place(x=210,y=260)
btnRead = Button(myGui,text='Read text',command=readText).place(x=210,y=200)
txtEntry = Entry(myGui, textvariable=strJson).place(x=150,y=160)
btnOptions = Button(myGui, text = "Options").place(x=150,y=260)
myGui.mainloop()
Vous n'analysez jamais la chaîne dans un dictionnaire (objet json). Remplacez data = mtext
Par: data = json.loads(mtext)
Vous devez également ajouter global data
À la méthode readText
parfois, vous devez utiliser json.loads à nouveau .. cela a fonctionné pour moi ..
jsonn_forSaleSummary_string = json.loads(forSaleSummary) //still string
jsonn_forSaleSummary = json.loads(jsonn_forSaleSummary_string)
enfin!! json
TypeError: string indices must be integers
Signifie une tentative d'accès à un emplacement dans une chaîne en utilisant un index qui n'est pas un entier. Dans ce cas, votre code (ligne 18) utilise la chaîne "type"
Comme index. Comme il ne s'agit pas d'un entier, une exception TypeError
est déclenchée.
Il semble que votre code s'attende à ce que data
soit un dictionnaire. Il y a (au moins) 3 problèmes:
json.loads(data)
dans la fonction readText()
. Cela renverra le dictionnaire que votre code attend ailleurs.data
est une variable globale dont la valeur est initialisée sur une chaîne vide (""
). Vous ne pouvez pas modifier une variable globale dans une fonction sans d'abord déclarer la variable à l'aide du mot clé global
._getCurrentOperator()
mais c'est avant tout traitement, il est donc toujours vide à ce stade et []
S'affiche. Déplacez print(list)
vers mhello()
après_getCurrentOperator()
. (BTW utilisant list
comme nom de variable n'est pas conseillé car cela masque le list
intégré)Vous pouvez modifier readText()
en ceci:
def readText():
global data
mtext=""
mtext = strJson.get()
mlabel2 = Label(myGui,text=mtext).place(x=180,y=200)
data = json.loads(mtext)