0

再会。

我已经设法使用以下代码从文本文件中加载字典:

def loadDictFile(data_folder):
    critDict = json.loads(open(data_folder+'critDict3.txt').read())
    print('json_data is', critDict)
    return critDict

我可以使用以下代码创建一个 tkinter UI,其中的复选框根据字典值打开或关闭:

def makeUI(data_folder, critDict):
    top = Tk()
    varList=[]
    for key, val in critDict.items():
        myVar = IntVar()#create intVar for this checkbutton
        varList.append(myVar) #append new intvar to a list
        key  = Checkbutton(top, text = key, command = update) #create new checkbutton with text
        if val[0] == 1:
            key.select()#turn on checkbutton if the dict value is 1
        key.pack()
        T = Text(top, height=2, width=30)#create text box
        T.pack()
        T.insert(END, val[1])#fill text box with comments from dict
        text = T.get("1.0",'end-1c')#get text from text box


    button=Button(top, text="Update", command=save)
    button.pack()

    top.mainloop()

运行函数的代码是:

data_folder = "C:\\Users\\NB\\Desktop\\checkbuttonTest\\"
critDict = loadDictFile(data_folder)
makeUI(data_folder, critDict)

字典文本文件 critDict3.txt 包含以下字符串:

{
  "crit2": [
    0,
    "comments2"
  ],
  "crit3": [
    1,
    "comments3"
  ],
  "crit1": [
    1,
    "comments"
  ],
  "crit4": [
    1,
    "comments4"
  ]
}

这一切似乎都很好。

但是我很难弄清楚如何获取任何更改的检查按钮(状态已被用户更改的按钮)的值并将它们保存回字典,以便可以将更改的值写回文本文件。

我认为我的问题是,由于我使用 for 循环创建了检查按钮,因此我不确定如何找到每个 intVar 的变量名称以获取正确检查按钮的检查按钮状态以放入正确的字典值列表...如果这是有道理的。

如果有人能指出我正确的方向,我将不胜感激。

4

1 回答 1

0

您的按钮与字典中的键具有相同的文本属性,这非常有用。当您声明 tkinter 变量并将其链接到小部件时,您可以将其存储在小部件的 .var 属性中。稍后,您可以使用 widget.cget('text') 将检查按钮和变量链接到每个字典键来获取小部件的文本。

def makeUI(data_folder, critDict):
    top = Tk()
    checkbuttons = []
    for key, val in critDict.items():
        myVar = IntVar() # create intVar for this checkbutton
        key  = Checkbutton(top, text=key, variable=myVar) #create new checkbutton with text
        checkbuttons.append(key)
        key.var = myVar
        key.var.set(val[0])
        key.pack()
        T = Text(top, height=2, width=30)#create text box
        T.pack()
        T.insert(END, val[1])#fill text box with comments from dict
        text = T.get("1.0",'end-1c')#get text from text box


    button=Button(top, text="Update", command=lambda: save(critDict, checkbuttons))
    button.pack()

    top.mainloop()

现在,如果您想访问与字典键关联的变量(它是检查按钮),您可以调用key.var.get(),然后将值保存到适当的字典键。保存可能看起来像这样。

def save(critDict, checkbuttons):
    for each in checkbutton:
        key = each.cget('text')
        critDict[key] = each.var.get()
于 2020-01-24T01:48:09.023 回答