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'>
当然,我可以通过解析字符串来解决这个问题,但对于包含的Python库来说,这似乎不是一种优雅的行为方式。
发布于 2020-12-13 03:51:59
这里发生了一些有趣的事情。
首先,作为Tkinter基础的嵌入式Tcl解释器没有布尔值的概念。它使用值0
表示false,并使用任何其他数字表示true。BoolVar
通过将内部Tcl变量包含的任何内容转换为True
或False
,在其get
方法中处理此问题。
但是,您并没有调用该变量的get
方法。相反,您调用的是getvar
,它返回存储在tcl解释器中的未转换的原始值。
使问题更加复杂的是,您没有正确配置Checkbutton
。因为您没有定义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)}")
发布于 2020-12-13 01:35:04
要获取该值,可以使用变量本身,而不是获取master
实例值。
# 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'>
因此,它将变量的类型显示为boolean。
https://stackoverflow.com/questions/65271556
复制