Проблема с Python Tkinter Checkbutton

У меня есть две очень простые кнопки проверки, переменные которых я сохраняю в списке (varss) и одной кнопке. Но я не понимаю, почему, когда я вызываю var_states (нажатием кнопки), я не могу получить значения off/on. Любая помощь приветствуется. Благодарю!

from Tkinter import *
def run(): # create the root and the canvas root = Tk() canvas = Canvas(root, width=300, height=200) canvas.pack() class Struct: pass canvas.data = Struct() # canvas.data.givenIngredients = set() prefInput(canvas) # and launch the app root.mainloop()
def var_states(varss): for var in varss: var.get()
def prefInput(canvas): master = Tk() var1, var2 = IntVar(), IntVar() Checkbutton(master, text="male", variable=var1).grid(row=1, sticky=W) varss = [var1, var2] Checkbutton(master, text="female", variable=var2).grid(row=2, sticky=W) Button(master, text='Show', command=lambda:var_states(varss)).grid(row=4, sticky=W, pady=4)
run()
1 ответ

Вы создали два интерпретатора Tcl, один с каждым вызовом Tk(). Каждый интерпретатор Tcl имеет переменные, отличные от всех других интерпретаторов Tcl.

Созданный первый интерпретатор становится интерпретатором по умолчанию для объекта Tkinter, который явно не связан с существующим интерпретатором (например, передавая виджет в этом интерпретаторе его "хозяину" в его конструкторе)

Вероятно, вы не собираетесь создавать два интерпретатора, поэтому для стартеров не выполняйте

master = Tk()

в prefInput. Вместо этого используйте аргумент canvas в качестве первого аргумента для ваших вызовов Checkbutton (замените master), а также используйте его в вызовах IntVar: var1, var2 = IntVar(canvas), IntVar(canvas). (если вы хотите получить дополнительное окно в своем приложении, используйте Tkinter.Toplevel вместо Tkinter.Tk для второго окна)

Наконец, для тестирования я изменил вашу функцию Var_states чтобы напечатать дополнительную информацию:

def var_states(varss): print "var_states", varss for var in varss: print var, var.get()

Затем финальная программа гласит:

from Tkinter import *
def run(): # create the root and the canvas root = Tk() canvas = Canvas(root, width=300, height=200) canvas.pack() class Struct: pass canvas.data = Struct() # canvas.data.givenIngredients = set() prefInput(canvas) # and launch the app root.mainloop()
def var_states(varss): print "var_states", varss for var in varss: print var, var.get()
def prefInput(canvas): var1, var2 = IntVar(canvas), IntVar(canvas) Checkbutton(canvas, text="male", variable=var1).grid(row=1, sticky=W) varss = [var1, var2] Checkbutton(canvas, text="female", variable=var2).grid(row=2, sticky=W) Button(canvas, text='Show', command=lambda:var_states(varss)).grid(row=4, sticky=W, pady=4)
run()

licensed under cc by-sa 3.0 with attribution.