使用tkinter中具有相同值的两个单独检查按钮



在这段代码中,我试图使用这两个检查按钮,它们应该是活动的/非活动的,彼此完全独立,但它没有按预期工作:

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())

(注意:还没有足够的声誉发表评论)

相关内容

  • 没有找到相关文章

最新更新