gpt4 book ai didi

python - 为什么 Tkinter 的单选按钮在使用 StringVar 而不是 IntVar 时都开始选中?

转载 作者:太空狗 更新时间:2023-10-29 22:21:19 29 4
gpt4 key购买 nike

下面是一些创建 4 个 Radiobutton 的示例代码,其中 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 则没有。是否有一个原因?有什么解决办法吗?我知道我可以通过使用数字值然后将它们转换为字符串来解决这个问题,但我想先了解为什么会发生这种情况。

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

编辑:澄清一下,按钮在被点击后仍然可以正常工作。

最佳答案

在第二组单选按钮的情况下,它们以“三态模式”呈现。

根据official documentation 1:

If the variable's value matches the tristateValue, then the radiobutton is drawn using the tri-state mode. This mode is used to indicate mixed or multiple values.

解释

tristatevalue 的默认值是空字符串,StringVar 的默认值是空字符串。对于第二组单选按钮,变量值和 tristatevalue 都相同,因此您看到的是“三态模式”。

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

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

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

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

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

解决方案

单选按钮的最佳实践是始终确保默认值对应于单选按钮值之一,除非您真的想要“三态模式”。

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

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 的薄包装器,此文档是小部件行为方式的权威答案。

关于python - 为什么 Tkinter 的单选按钮在使用 StringVar 而不是 IntVar 时都开始选中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40684739/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com