热门标签:
Q:

为什么Tkinter的单选按钮在使用StringVar时全部被选中而不是IntVar?

下面是一些使用 int 创建4 Radiobutton s,使用 int 创建2和使用 str 创建2的示例代码:

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()

运行这个后,我有一个看起来像这样的盒子:

src=

由于某种原因, str 的开始被选中,而 int 的则没有。 这有什么原因吗? 有什么解决办法吗? 我知道我可以通过使用数字值然后将它们转换为字符串来解决它,但我想了解为什么首先发生这种情况。

如果这很重要,我正在使用 Windows10

编辑: 为了澄清,按钮在被点击后仍然正常工作。

原网址
A:

在第二组radiobutton的情况下,它们正在以"三态模式"呈现。

根据官方文档1:

如果变量的值与tristateValue匹配,则 radiobutton使用三态模式绘制。 此模式用于 指示混合或多个值。

解释说明

tristatevalue的默认值为空字符串,aStringVar的默认值为空字符串。 对于你的第二组radiobutton,变量值和tristatevalue都是相同的,所以你看到的是"三态模式"。

IntVar的情况下,变量的默认值为零。 tristatevalue仍然是空字符串。 这两个是不同的,所以小部件不会出现在"三态模式"。

为了证明这一点,将第一组radiobuttons的tristatevalue设置为零,以便它与关联变量的默认值匹配,您将看到它们的外观发生变化以匹配第二组。

int1 = Radiobutton(..., tristatevalue=0)
int2 = Radiobutton(..., tristatevalue=0)

同样,您可以将第二个集合的tristatevalue设置为默认值以外的其他值,以便它们看起来像第一个集合:

str1 = Radiobutton(..., tristatevalue="x")
str2 = Radiobutton(..., tristatevalue="x")

解决方案

Radiobuttons的最佳实践是始终确保默认值对应于radiobutton值之一,除非您确实想要"三态模式"。

在您的情况下,您应该将变量初始化为其中一个radiobutton的值:

self.v1 = IntVar(value=1)
self.v2 = StringVar(value="1")

。.. 或者在创建它们之后,通过set:

self.v1.set(1)
self.v2.set("1")

1链接转到tcl/tk手册页。 Tkinter只是一个关于tcl/tk的薄包装器,这个文档是小部件行为的最终答案。

所有回答

共 1 条

author avatar

感谢@Bryan Oakley的详细解释。

为了简化,

一旦启动,"Sam"单选按钮将被选中

self.name = tk.StringVar(value='Sam')  ## is like self.name.set('Sam'), will preset the value as "Sam" 
name_rad1 = tk.Radiobutton(frame, text='Sam', variable=self.name, value='Sam', command=None)
name_rad1.pack(side=tk.LEFT)

No单选按钮将被选中一旦启动

self.name = tk.StringVar(value=' ')  ## the value will be " ", when you print(self.name.get())
name_rad1 = tk.Radiobutton(frame, text='Sam', variable=self.name, value='Sam', command=None)
name_rad1.pack(side=tk.LEFT)

相似问题