2015-01-08 69 views
13

我试图创建一个程序,它将通过GUI读取JSON字符串,然后使用它来执行其他功能,在这种情况下分解一个数学公式。此刻我得到的错误:读取JSON字符串| TypeError:字符串索引必须是整数

"TypeError: string indices must be integers"

我不知道为什么。

我试图在阅读的JSON如下:

{ 
"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() 
+0

你可以给整个堆栈跟踪? –

+0

嗨,感谢您的回复:)运行程序时,呼叫堆栈窗口仍然为空 –

回答

16

你永远解析字符串到词典(JSON对象)。更改data = mtext到:data = json.loads(mtext)您还应该添加global data到READTEXT方法

+0

@Rawing你的意思是在mhello的权利?原因_getCurrentOperator已经通过参数获取它。 –

+0

确定TY将编辑。我总是使用OOP,所以我不熟悉全球。 –

+0

感谢您的回复!完成这些更改后,我仍然遇到完全相同的错误 –

4

TypeError: string indices must be integers意味着试图在字符串中访问的位置使用索引不是整数。在这种情况下,您的代码(第18行)使用字符串"type"作为索引。由于这不是一个整数,所以引发了一个TypeError异常。

看来你的代码预计data是一个字典。有(至少)3个问题:

  1. 您没有解码(“加载”)JSON字符串。为此,您应该在readText()函数中使用json.loads(data)。这将返回您的代码在别处预期的字典。
  2. data是一个全局变量,其值初始化为空字符串("")。没有首先使用global关键字声明变量,则不能在函数内修改全局变量。
  3. 该代码通过向其添加连续的项目来构建列表,但是,该列表未在别处使用。它是在_getCurrentOperator()的定义之后打印的,但是这是在任何处理完成之前,因此它在该点仍然是空的,并显示[]。在_getCurrentOperator()之后将print(list)移至mhello()。 (顺便说一句使用list如不建议一个变量名,因为这阴影内建list

您可以修改readText()这样:

def readText(): 
    global data 
    mtext="" 
    mtext = strJson.get() 
    mlabel2 = Label(myGui,text=mtext).place(x=180,y=200) 
    data = json.loads(mtext) 
+0

“看来你的代码期望数据成为一本字典。” +1 – Robin

3

有时你需要再次使用json.loads .. 这对我有效..

jsonn_forSaleSummary_string = json.loads(forSaleSummary) //still string 
jsonn_forSaleSummary  = json.loads(jsonn_forSaleSummary_string) 

终于!! json

相关问题