在这段代码中,我试图使用这两个检查按钮,它们应该是活动的/非活动的,彼此完全独立,但它没有按预期工作:
from tkinter import *
root = Tk()
enable = {'jack': 0, 'john': 0}
def actright(x):
print(enable.get(x))
for machine in enable:
l = Checkbutton(root, text=machine, variable=enable[machine], onvalue=1, offvalue=0,
command = lambda: actright(machine))
l.pack(anchor = W)
root.mainloop()
当选中"jack"或"john"时,它们都会同时激活/停用。我认为这是因为它们以相同的值启动,但有没有一种方法可以使它们独立,但仍然以"0"启动?
除了我的主要问题之外,我还有一个子主题:无论按钮被检查了多少次,它们仍然返回"0",但是检查按钮的"onvalue"被设置为1,所以它们不应该在返回1和0之间交替吗?
您需要一个包含IntVars
(甚至checkButtons)的字典。然后您需要通常的lambda machine=machine
(在循环中初始化小部件时的经典gotcha)。所以结果会是这样的:
from tkinter import *
root = Tk()
enable = {'jack': 0, 'john': 0}
checkvalues = {}
def actright(x):
print(x, checkvalues[x].get())
for machine in enable:
myvar = IntVar()
myvar.set(enable[machine])
checkvalues[machine] =myvar
l = Checkbutton(root, text=machine, onvalue=1, offvalue=0, variable = myvar,
command = lambda machine=machine: actright(machine))
l.pack(anchor = W)
root.mainloop()
为Eric Levieil的出色回答锦上添花;如果您只想打印二进制文件,请确保在不打印x的情况下定义actright(),否则您将在与该值关联的字典中打印名称。
def actright(x):
print(checkvalues[x].get())
(注意:还没有足够的声誉发表评论)