Сохранить измененное состояние текстовой кнопки обратно в список значений словаря, индекс 0

Добрый день.

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

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

Все это работает нормально.

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

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

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


person lor    schedule 24.01.2020    source источник


Ответы (1)


Ваши кнопки имеют тот же текстовый атрибут, что и ключи в вашем словаре, что очень полезно. Когда вы объявляете переменную 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()
person schwartz721    schedule 24.01.2020
comment
Спасибо, @schwartz721, это интересно. Я заметил, что вы удалили строки для установки флажка, если значение dict равно 1. Теперь флажки не отображают значение словаря. Я чувствую, что это должно быть в коде, но вы, очевидно, гораздо более опытный кодер, чем я. Я что-то упустил? Спасибо. - person lor; 24.01.2020
comment
Кнопка в нижней части пользовательского интерфейса предназначена для запуска функции сохранения, чтобы сохранить key.vars обратно в dict. Однако я не могу передать key.var функции сохранения с помощью команды кнопки, которая не принимает никаких аргументов. Можете ли вы предложить способ сделать это? Благодарность - person lor; 24.01.2020
comment
Я попробовал лямбда: update(key.var) для запуска функции обновления для обновления dict, но функция обновления не будет принимать key.var в качестве аргумента. Ошибка синтаксиса. Извините, я новый кодер и немного потерялся. - person lor; 24.01.2020
comment
Когда переменная связана с кнопкой-флажком, изменение значения переменной изменит внешний вид кнопки-флажка. Я забыл связать чеккнопку и переменную, я отредактировал свой пост, чтобы исправить это - person schwartz721; 24.01.2020
comment
ОМГ, я работаю над этим уже неделю. БЛАГОДАРЮ ВАС. Я так многому научился. - person lor; 24.01.2020