2015-01-08 39 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

相關問題