Python 为什么Tkinter getvar()返回Booleanvar的字符串类型?
Tkinter为存储在其小部件中的布尔值提供BooleanVar类型。 但是,对命名的BooleanVar使用getvar方法会返回字符串类型。这对我来说没有意义,因为BooleanVar getter应该返回布尔值 了解Tkinter为什么是这样做的吗 下面是一个简单的示例代码,显示了发生的情况: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() #
# 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,使用任何其他数字表示trueBoolVar
在其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语言时,它默认为字符串一点也不奇怪。