Проблема с 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.