为什么Tkinter的单选按钮在使用StringVar但不是IntVar时全部启动?

Whu*_*hud 6 python tk-toolkit tkinter radio-button python-3.x

下面是一些创建4个单选按钮的示例代码,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()
Run Code Online (Sandbox Code Playgroud)

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

出于某种原因,str的开始被选中,而int的则没有.是否有一个原因 ?它有什么问题吗?我知道我可以通过使用数字valuse然后将它们转换为字符串来解决它,但我想先了解为什么会发生这种情况.

如果重要的话,我正在使用Windows 10.

编辑:对于clerification,按钮在单击后仍然可以正常工作.

感谢您的任何帮助

Bry*_*ley 9

在第二组无线电按钮的情况下,它们以"三态模式"呈现.

根据官方文件1:

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

说明

默认tristatevalue值为空字符串,a的默认值为StringVar空字符串.对于你的第二组radiobuttons,变量值和tristatevalue它们是相同的,所以你看到"三态模式".

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

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

int1 = Radiobutton(..., tristatevalue=0)
int2 = Radiobutton(..., tristatevalue=0)
Run Code Online (Sandbox Code Playgroud)

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

str1 = Radiobutton(..., tristatevalue="x")
str2 = Radiobutton(..., tristatevalue="x")
Run Code Online (Sandbox Code Playgroud)

radiobuttons的最佳实践是始终确保默认值对应于radiobutton值之一(除非您确实需要"三态模式").

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

self.v1 = IntVar(value=1)
self.v2 = StringVar(value="1")
Run Code Online (Sandbox Code Playgroud)

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

self.v1.set(1)
self.v2.set("1")
Run Code Online (Sandbox Code Playgroud)

1链接转到tcl/tk手册页.Tkinter只是tcl/tk的一个薄包装器,这个文档是小部件行为方式的明确答案.