首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么Tkinter getvar()返回Booleanvar的字符串类型?

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

Stack Overflow用户
提问于 2020-12-13 09:23:43
回答 2查看 245关注 0票数 1

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

你能理解为什么Tkinter会变成这样吗?

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

代码语言:javascript
代码运行次数:0
运行
复制
# 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()

它会创建一个带有复选框的窗口。单击复选框后,此输出将打印到终端:

代码语言:javascript
代码运行次数:0
运行
复制
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库来说,这似乎不是一种优雅的行为方式。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-13 11:51:59

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

首先,作为Tkinter基础的嵌入式Tcl解释器没有布尔值的概念。它使用值0表示false,并使用任何其他数字表示true。BoolVar通过将内部Tcl变量包含的任何内容转换为TrueFalse,在其get方法中处理此问题。

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

使问题更加复杂的是,您没有正确配置Checkbutton。因为您没有定义onvalueoffvalue选项,所以它们缺省为字符串"1“和"0”。

如果您正确地将onvalueoffvalue设置为TrueFalse,并调用变量的get方法而不是使用getvar,您将得到一个正确的布尔值。

或者,如果您想使用getvar,则应该像BoolVar一样,使用内部tkinter函数getboolean将值转换为布尔值。

代码语言:javascript
代码运行次数:0
运行
复制
Checkbutton(..., onvalue=True, offvalue=False)
...
def printvar():
    ...
    value = master.tk.getboolean(master.getvar(name="bool"))
    print(f"value: {value} type of value: {type(value)}")
票数 2
EN

Stack Overflow用户

发布于 2020-12-13 09:35:04

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

代码语言:javascript
代码运行次数:0
运行
复制
# 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()

输出:

代码语言:javascript
代码运行次数:0
运行
复制
Value of BooleanVar() True
Type of BooleanVar() <class 'bool'>
Value of BooleanVar() False
Type of BooleanVar() <class 'bool'>

因此,它将变量的类型显示为boolean。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65271556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档