将更改的文本按钮状态保存回字典值列表索引 0

Save changed textbutton state back to dictionary value list index 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 的变量名来获取要放入的正确复选按钮的复选按钮状态正确的字典值列表...如果有意义的话。

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

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

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()