Python 为什么Tkinter';s单选按钮在使用StringVar而不是IntVar时全部启动?
下面是一些示例代码,它创建了4个Python 为什么Tkinter';s单选按钮在使用StringVar而不是IntVar时全部启动?,python,python-3.x,tkinter,radio-button,tk,Python,Python 3.x,Tkinter,Radio Button,Tk,下面是一些示例代码,它创建了4个单选按钮s,2个使用int和2个使用str: from tkinter import * class test: def __init__(self): wind = Tk() frame1 = Frame(wind) frame1.pack() self.v1 = IntVar() self.v2 = StringVar() int1 = Radiobut
单选按钮
s,2个使用int
和2个使用str
:
from tkinter import *
class test:
def __init__(self):
wind = Tk()
frame1 = Frame(wind)
frame1.pack()
self.v1 = IntVar()
self.v2 = StringVar()
int1 = Radiobutton(frame1, text = 'int1', variable = self.v1, value = 1,
command = self.ipress)
int2 = Radiobutton(frame1, text = 'int2', variable = self.v1, value = 2,
command = self.ipress)
str1 = Radiobutton(frame1, text = 'str1', variable = self.v2, value = '1',
command = self.spress)
str2 = Radiobutton(frame1, text = 'str2', variable = self.v2, value = '2',
command = self.spress)
int1.grid(row = 1, column = 1)
int2.grid(row = 1, column = 2)
str1.grid(row = 2, column = 1)
str2.grid(row = 2, column = 2)
str1.deselect() #this didn't fix it
str2.deselect()
def ipress(self):
print('int'+str(self.v1.get()))
def spress(self):
print('str'+self.v2.get())
test()
运行此命令后,我有一个如下所示的框:
由于某种原因,str
的开始被选中,而int
的开始被选中。这有什么原因吗?有什么补救办法吗?我知道我可以通过使用数值然后将它们转换成字符串来解决这个问题,但我想知道为什么会先发生这种情况
如果有必要的话,我正在使用Windows10
编辑:为了澄清,按钮在被点击后仍能正常工作。对于第二组单选按钮,它们将以“三态模式”呈现 根据第1条: 如果变量的值与tristateValue匹配,则 radiobutton使用三态模式绘制。此模式用于 指示混合值或多个值 解释
tristatevalue
的默认值为空字符串,StringVar
的默认值为空字符串。对于第二组单选按钮,变量值和三态值都相同,因此您可以看到“三态模式”
对于IntVar
,变量的默认值为零。三态值仍然是空字符串。这两者是不同的,因此小部件不会出现在“三态模式”
为了证明这一点,请将第一组单选按钮的tristatevalue
设置为零,以便它与关联变量的默认值匹配,您将看到它们的外观更改为与第二组匹配
int1 = Radiobutton(..., tristatevalue=0)
int2 = Radiobutton(..., tristatevalue=0)
同样,可以将第二个集合的三态值
设置为默认值以外的值,以便它们看起来像第一个集合:
str1 = Radiobutton(..., tristatevalue="x")
str2 = Radiobutton(..., tristatevalue="x")
解决方案
使用单选按钮的最佳实践是始终确保默认值与其中一个单选按钮值相对应,除非您确实需要“三态模式”
在您的情况下,应将变量初始化为以下单选按钮之一的值:
self.v1 = IntVar(value=1)
self.v2 = StringVar(value="1")
。。。或者在创建它们之后,通过设置:
self.v1.set(1)
self.v2.set("1")
1该链接指向tcl/tk手册页。Tkinter只是tcl/tk的一个薄薄包装,本文档是小部件行为的最终答案。FWIW,我在Ubuntu 14.04上看到了类似的行为。str按钮都被选中,但都显示为灰色。@Robᵩ 谢谢你的信息,现在我知道这不是什么有线windows的东西!相关:从该线程来看,解决方法是self.v2.set(None)
。如果您提供了指向报价来源的链接,这会对我有所帮助。但是如何将值设置为”
,没有办法?@CoolCloud我不理解这个问题。您可以按正常方式将其设置为空字符串。@CoolCloud:是。如果您不希望此效果,但希望合法值为空字符串,则需要将三态值设置为其他值。@martineau:很抱歉,我误解了。是的,它们的行为不同,因为ttk小部件没有三态值。当您将tristatevalue
从等式中取出时,单选按钮在所有未选中的情况下表现相同。