Python 为什么Tkinter getvar()返回Booleanvar的字符串类型?

Python 为什么Tkinter getvar()返回Booleanvar的字符串类型?,python,tkinter,Python,Tkinter,Tkinter为存储在其小部件中的布尔值提供BooleanVar类型。 但是,对命名的BooleanVar使用getvar方法会返回字符串类型。这对我来说没有意义,因为BooleanVar getter应该返回布尔值 了解Tkinter为什么是这样做的吗 下面是一个简单的示例代码,显示了发生的情况: # importing tkinter module from tkinter import * # creating Tk() variable master = Tk() #

Tkinter为存储在其小部件中的布尔值提供BooleanVar类型。 但是,对命名的BooleanVar使用getvar方法会返回字符串类型。这对我来说没有意义,因为BooleanVar getter应该返回布尔值

了解Tkinter为什么是这样做的吗

下面是一个简单的示例代码,显示了发生的情况:

# importing tkinter module 
from tkinter import *
  
# creating Tk() variable 
master = Tk() 
  
# Tkinter variables 
boolvar = BooleanVar(master, name ="bool") 
Checkbutton(master, 
            text="check", 
            variable=boolvar,
            command=lambda: printvar()).grid(row=0, sticky=W)
  
# Setting values of variables 
master.setvar(name ="bool", value = False)
  
# getting values of each variables using getvar() method
def printvar():
    print("Value of BooleanVar()", master.getvar(name ="bool"))
    print("Type of BooleanVar()", type(master.getvar(name ="bool")))
mainloop()
创建带有复选框的窗口。单击复选框时,此输出将由打印机发送到终端:

Value of BooleanVar() 1
Type of BooleanVar() <class 'str'>
Value of BooleanVar() 0
Type of BooleanVar() <class 'str'>
Value of BooleanVar() 1
Type of BooleanVar() <class 'str'>
Value of BooleanVar() 0
Type of BooleanVar() <class 'str'>
BooleanVar()1的值 BooleanVar()的类型 BooleanVar()的值为0 BooleanVar()的类型 BooleanVar()1的值 BooleanVar()的类型 BooleanVar()的值为0 BooleanVar()的类型
当然,我可以通过解析字符串来解决这一问题,但对于包含的Python库来说,这似乎不是一种优雅的行为方式。

要获取值,可以使用变量本身,而不是获取
实例值

# importing tkinter module 
from tkinter import *
  
# creating Tk() variable 
master = Tk() 
  
# Tkinter variables 
boolvar = BooleanVar(master, name ="bool") 
x = Checkbutton(master, 
            text="check", 
            variable=boolvar,
            command=lambda: printvar()).grid(row=0, sticky=W)
  
# Setting values of variables 
master.setvar(name ="bool", value = False)
  
# getting values of each variables using get() method
def printvar():
    print("Value of BooleanVar()", boolvar.get())
    print("Type of BooleanVar()", type(boolvar.get()))
mainloop()
输出:

Value of BooleanVar() True
Type of BooleanVar() <class 'bool'>
Value of BooleanVar() False
Type of BooleanVar() <class 'bool'>
BooleanVar()的值为True BooleanVar()的类型 BooleanVar()的值为False BooleanVar()的类型
因此,它将变量的类型显示为布尔值。

这里发生了一些有趣的事情

首先,作为Tkinter的基础的嵌入式TCL解释器没有布尔值的概念。它使用值

0
表示false,使用任何其他数字表示true
BoolVar
在其
get
方法中通过将内部Tcl变量持有的任何内容转换为
True
False
来处理该问题

但是,您没有调用变量的
get
方法。相反,您调用的是
getvar
,它返回存储在tcl解释器中的原始、未转换的值

使问题更加复杂的是,您没有正确配置
检查按钮
。由于未定义
onvalue
offvalue
选项,因此它们默认为字符串“1”和“0”

如果将
onvalue
offvalue
正确设置为
True
False
,并调用变量的
get
方法,而不是使用
getvar
,则会返回正确的布尔值

或者,如果您想使用
getvar
,您应该执行
BoolVar
的操作,并使用内部tkinter函数
getboolean
将值转换为布尔值

Checkbutton(..., onvalue=True, offvalue=False)
...
def printvar():
    ...
    value = master.tk.getboolean(master.getvar(name="bool"))
    print(f"value: {value} type of value: {type(value)}")

感谢您的详细解释-我很感兴趣的是,复选框默认为字符串值,但这对于您的其余解释是有意义的。@shimmer\u flight:底层tkinter是一个tcl解释器。整个语言是基于字符串的。虽然它当然支持数字,但它的口号是“一切都是字符串”。当您理解Tcl语言时,它默认为字符串一点也不奇怪。