tkinter Checkbutton 小部件返回错误的布尔值

Posted

技术标签:

【中文标题】tkinter Checkbutton 小部件返回错误的布尔值【英文标题】:tkinter Checkbutton widget returning wrong boolean value 【发布时间】:2017-10-13 17:13:14 【问题描述】:

我在这里有一个简单的 GUI,它假设返回一个布尔值,具体取决于检查按钮是否被选中。我已将布尔变量设置为 False,因此设置了空检查按钮。我不明白的是,当我检查按钮时,绑定到该小部件的函数返回 False 而不是 True。这是为什么呢?

这是代码...

from tkinter import *
from tkinter import ttk

def getBool(event):
    print(boolvar.get())

root = Tk()

boolvar = BooleanVar()
boolvar.set(False)

cb = Checkbutton(root, text = "Check Me", variable = boolvar)
cb.bind("<Button-1>", getBool)
cb.pack()

root.mainloop()

检查空按钮时,函数输出...

False

既然按钮被选中,它不应该返回True吗?

【问题讨论】:

我怀疑您的绑定在单击鼠标的那一刻触发 - 在 Checkbutton 有机会更新其状态之前。尝试改用 Checkbutton 的 command= 选项。 【参考方案1】:

在进行绑定回调后,布尔值会发生变化。举个例子,看看这个:

from tkinter import *

def getBool(event):
    print(boolvar.get())


root = Tk()

boolvar = BooleanVar()
boolvar.set(False)
boolvar.trace('w', lambda *_: print("The value was changed"))

cb = Checkbutton(root, text = "Check Me", variable = boolvar)
cb.bind("<Button-1>", getBool)
cb.pack()

root.mainloop()

当你按下Checkbutton时,第一个输出是False然后是"The value was changed",这意味着在getBool回调完成后值被改变了。

你应该做的是使用command参数来设置回调,看:

from tkinter import *

def getBool(): # get rid of the event argument
    print(boolvar.get())


root = Tk()

boolvar = BooleanVar()
boolvar.set(False)
boolvar.trace('w', lambda *_: print("The value was changed"))

cb = Checkbutton(root, text = "Check Me", variable = boolvar, command = getBool)
cb.pack()

root.mainloop()

输出首先是"The value was changed",然后是True

在我的示例中,我使用了boolvar.trace,它在布尔值更改时运行 lambda 回调 ('w')

【讨论】:

好的,我明白了,谢谢。为了彻底的解释

以上是关于tkinter Checkbutton 小部件返回错误的布尔值的主要内容,如果未能解决你的问题,请参考以下文章

如何增加 Checkbutton 的大小 - Tkinter

Tkinter类之窗口部件类

Tkinter 组件

如何从小部件的函数返回值,并将其传递给 Tkinter,Python 中的另一个小部件的函数

如何创建带有标签图像的Checkbuttons?

tkinter checkbutton 第一节