Tkinter Checkbutton在更改变量时不更新

3
我有一个用Python 3.8在我的Macbook上开发的tkinter GUI。 我遇到了一个问题,更改与复选框关联的变量不会改变复选框本身的外观。 如果我将与之相关的IntVar()设置为1,则希望复选框显示为已选中状态,并且从我所读的所有内容来看,应该发生这种情况。
以下是显示问题的极其简化的代码:
import tkinter as tk

class Window():
    def __init__(self, master):
        var = tk.IntVar()
        checkbutton = tk.Checkbutton(master, variable=var)
        checkbutton.pack()
        var.set(1)

root = tk.Tk()
Window(root)
root.mainloop()

当我运行脚本时,复选框未被选中。但我仍然可以通过单击它来选择复选框。这是已知的错误还是我漏掉了什么?

1
你必须将变量存储在与小部件同寿命的某个地方。作为局部变量,它会立即被垃圾回收,导致 Checkbutton 没有地方存储其状态。 - jasonharper
谢谢!将Var作为checkbutton本身的属性存储起来是可行的! checkbutton.var = var - schwartz721
1个回答

2
解决方案:正如jasonharper所指出的那样,问题出在垃圾回收上。tkinter变量没有被用于任何事情,只是作为局部变量存储,因此被丢弃,无法被checkbutton引用。将IntVar保存在某个持久的位置可以解决这个问题。一个解决方案就是将变量保存在checkbutton本身的var属性中:
import tkinter as tk

class Window():
    def __init__(self, master):
        var = tk.IntVar()
        checkbutton = tk.Checkbutton(master, variable=var)
        checkbutton.pack()
        var.set(1)
        checkbutton.var = var

root = tk.Tk()
Window(root)
root.mainloop()

答案有点矛盾,因为它已经存储在变量属性中了。 - Nikolai Ehrhardt
答案有点矛盾,因为它已经存储在变量属性中了。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接