Tkinter单选按钮显示'-'的原因及底层原理咨询
Tkinter单选按钮显示'-'的原因及底层逻辑
一、单选按钮显示'-'的含义
Tkinter里单选按钮显示'-',代表当前绑定的变量值和所有单选按钮的value参数都不匹配,按钮处于「不确定状态」。这种情况下变量依然有返回值——比如你提供的代码里,btn1 = StringVar()默认初始化是空字符串,调用btn1.get()会返回这个空值,只是它不在三个单选按钮的value("euro"/"dollar"/"yen")范围内,所以按钮无法匹配到选中状态,就显示'-'。
你可以测试:点击任意一个单选按钮后,变量值会被设置为对应按钮的value,按钮就会显示正常的选中圆点,此时btn1.get()会返回选中的货币字符串。
二、类中绑定self后恢复正常的底层原因
在类里如果没把StringVar绑定到self,这个变量很可能被Python的垃圾回收机制回收了。
Tkinter的变量(StringVar、IntVar等)是Python对象和Tk底层代码之间的桥梁,需要Python端保持对这个变量的引用,才能维持和Tk控件的绑定关系。如果变量只是类方法里的局部变量,或者没有绑定到self这样的持久化实例属性,方法执行完后变量就失去了引用,会被垃圾回收器销毁。此时单选按钮失去了有效的变量绑定,就会进入不确定状态显示'-'。
把StringVar绑定到self后,只要类实例存在,这个变量的引用就会被保留,不会被回收,单选按钮就能正常和变量联动,恢复正常的选中/未选中逻辑。
示例代码
from tkinter import * root = Tk() btn1 = StringVar() def do_something(): val0 = entry1.get() val1 = btn1.get() print("The variable values are " + val1 + " and " + val0) print("The method values are " + btn1.get() + " and " + entry1.get()) rb1 = Radiobutton(root, text="Euro", value="euro", variable=btn1).grid(row=2, column=1, sticky=W) rb2 = Radiobutton(root, text="Dollar", value="dollar", variable=btn1).grid(row=3, column=1, sticky=W) rb3 = Radiobutton(root, text="Yen", value="yen", variable=btn1).grid(row=4, column=1, sticky=W) label1 = Label(root, text="Input Here") label1.grid(row=1, sticky=E) entry1 = Entry(root) entry1.grid(row=1, column=1, sticky=W) go = Button(root, text="Print Selection", fg="white", bg="black", command=do_something) go.grid(row=10, columnspan=3) root.mainloop()
内容的提问来源于stack exchange,提问作者David 04
相关产品推荐
相关产品推荐

