Я пытаюсь создать список флажков с циклом. Я изменил реализацию кода другого, который использует ту же концепцию и должен иметь ту же функцию, что и я. Когда я пытаюсь распечатать состояние каждого флажка, ни один из них не обновляется до 1. Они все остаются на 0, даже если я нажимаю на них. Вот мой код, функция test() не ведет себя так, как я ожидаю. Спасибо, за помощь
import tkinter
import tkinter.filedialog
import os
# --- functions ---
def browse():
filez = tkinter.filedialog.askdirectory(parent=window, title='Choose a file')
ent1.insert(20, filez)
dirs = os.listdir(filez)
# remove previous IntVars
intvar_dict.clear()
# remove previous Checkboxes
for cb in checkbutton_list:
cb.destroy()
checkbutton_list.clear()
for filename in dirs:
# create IntVar for filename and keep in dictionary
var = tkinter.IntVar()
# create Checkbutton for filename and keep on list
c = tkinter.Checkbutton(window, text=filename, variable=var)
c.pack()
intvar_dict[filename] = var
checkbutton_list.append(c)
def test():
for key, value in intvar_dict.items():
if value.get() > 0:
print("HIIIIII")
print('selected:', key)
#print (value.get())
# --- main ---
# to keep all IntVars for all filenames
intvar_dict = {}
# to keep all Checkbuttons for all filenames
checkbutton_list = []
window = tkinter.Tk()
lbl = tkinter.Label(window, text="Path")
lbl.pack()
ent1 = tkinter.Entry(window)
ent1.pack()
btn1 = tkinter.Button(window, text="Select Path", command=browse)
btn1.pack()
btn1 = tkinter.Button(window, text="Test Checkboxes", command=test)
btn1.pack()
window.mainloop()
Этот код работает отлично, если он выполняется напрямую, однако проблема, описанная в вопросе, возникает, если код запускается из QtConsole. Эту проблему можно устранить, указав мастер IntVar
: var = tkinter.IntVar(master=window)
.
Действительно, QtConsole автоматически создает экземпляр Tk
, поэтому при создании window
есть два экземпляра Tk
. Затем, когда IntVar
, tkinter связывает его с первым экземпляром Tk
, то есть не с мастером Checkbutton
. Поскольку Checkbutton
и IntVar
не принадлежат к одному экземпляру Tk
(т. Checkbutton
IntVar
интерпретаторам Tcl), они не могут общаться. Вот почему значение переменной не соответствует состоянию флажка.