首页 > 解决方案 > Tkinter 中复选框的奇怪行为

问题描述

所以,我正在学习,我被checkbuttons这个Tkinter奇怪的问题困住了。这是我正在使用的代码

root = Tk()
def showValue():
    print(val.get())
    Label(text=str(val.get())).pack()
val = StringVar()
Checkbutton(root, text="Check me!", variable=val, onvalue="on", offvalue="off").pack()
Button(text="Click",command=showValue).pack()
root.mainloop()

首先,默认情况下选中该框,我认为这是因为offvalue设置为非 False(即不是 0 或空字符串),如果我错了,请纠正我。但是,我在这里注意到的奇怪的事情是,当我点击按钮时,理想情况下它应该向我显示一个带有 的标签text="on",但实际上直到我手动取消选择该框后才显示,之后按钮的行为正常。我知道我无法正确解释这里发生的事情,但如果你自己尝试一下,你会看到它。这是 GUI 的图像。 现在,您在按钮之后看到的两个空白行实际上是因为我在对复选框执行任何操作之前单击了两次按钮,并且一旦我取消选择复选框然后单击按钮,它就会显示
在此处输入图像描述
off. 有人可以请这里实际发生的事情吗?提前致谢!

标签: pythontkinter

解决方案


你只需要使用StringVar(value="off"). 这样做Label(text=str(val.get())).pack()也会导致内存泄漏,但您必须使用config将结果定位在同一位置Label.config(text=val.get())。我已经重构了代码以使其更具可读性。

from tkinter import *


def showValue():
    Label.config(text=val.get())


root = Tk()


val = StringVar(value="off")
check = Checkbutton(root, text="Check me!", variable=val, onvalue="on", offvalue="off")
check.pack()

btn = Button(text="Click",command=showValue)
btn.pack()

lbl = Label(root)
lbl.pack()


root.mainloop()

推荐阅读