Сохранить измененное состояние текстовой кнопки обратно в индекс списка значений словаря 0 - PullRequest
0 голосов
/ 24 января 2020

Добрый день.

Мне удалось загрузить словарь из текстового файла с таким кодом:

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

И я могу создать пользовательский интерфейс tkinter с включенными или выключенными флажками в соответствии со значениями словаря, используя следующий код:

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"
  ]
}

Кажется, что все это работает нормально.

Но мне очень трудно понять, как получить значения любых измененных кнопок (кнопки, состояние которых было изменено пользователем). и сохраните их обратно в словарь, чтобы измененные значения можно было записать обратно в текстовый файл.

Я думаю, что моя проблема в том, что, поскольку я создал кнопки-флажки для l oop, я не уверен, как найти имя переменной каждого intVar, чтобы получить состояние кнопки проверки правой кнопки проверки, чтобы поместить в правильный список значений словаря ... если это имеет смысл.

Если кто-нибудь может указать мне правильное направление, я был бы очень признателен.

1 Ответ

0 голосов
/ 24 января 2020

Ваши кнопки имеют тот же текстовый атрибут, что и ключи в вашем словаре, что очень полезно. Когда вы объявляете переменную 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()
...