tkinter Checkbutton状态获取异常,勾选未勾选均返回0如何解决?
你遇到的问题是Spyder运行环境的特性导致,代码本身逻辑没有错误,你当前使用的tk、conda、Spyder版本本身不存在兼容性问题,无需调整版本。
根本原因
Spyder默认使用IPython交互式控制台运行Tkinter程序时,未绑定到持久对象的IntVar实例会被Python的垃圾回收机制异常释放,导致Checkbutton和变量的绑定失效,因此无论是否勾选复选框,读取到的变量值永远是初始值0。
解决方法
方法1:修改变量挂载对象,避免被回收
将IntVar实例挂载到Tkinter主窗口对象上,保证变量生命周期和窗口一致,修改后的代码如下:
from tkinter import * def click_me(): print(root.i.get()) root = Tk() # 将IntVar挂载到root对象上,避免被垃圾回收 root.i = IntVar() c = Checkbutton(root, text = "Python", variable=root.i) c.pack() b = Button(root, text="Click here", command=click_me) b.pack() root.geometry("400x400+120+120") root.mainloop()
方法2:调整运行方式
不在Spyder的IPython控制台内运行该脚本,选择以下任意一种运行方式即可:
- 直接在系统终端中执行
python 你的脚本名.py - 在Spyder的运行配置中,将执行方式修改为在外部系统终端中执行
验证
按上述方法调整后,勾选复选框点击按钮会输出1,取消勾选输出0,符合预期效果。
内容的提问来源于stack exchange,提问作者Harry Spratt
相关产品推荐
相关产品推荐

