Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么Tkinter';s单选按钮在使用StringVar而不是IntVar时全部启动?_Python_Python 3.x_Tkinter_Radio Button_Tk - Fatal编程技术网

Python 为什么Tkinter';s单选按钮在使用StringVar而不是IntVar时全部启动?

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

下面是一些示例代码,它创建了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 = 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
从等式中取出时,单选按钮在所有未选中的情况下表现相同。