【问题标题】:Retrieve Tkinter Checkbutton Status : TclError: can't read "PY_VAR": no such variable检索 Tkinter Checkbutton 状态:TclError:无法读取“PY_VAR”:没有这样的变量
【发布时间】:2017-02-17 11:54:24
【问题描述】:

我在基本的 Python 2.7 GUI 应用程序中使用 Tkinter,我想使用 IntVar 检索 Checkbutton 小部件状态(选中/未选中),但我收到以下错误。

TclError: can't read "PY_VAR": no such variable

我已按照effbot about the Checkbutton Widget 上的示例进行操作,并且我为每个按钮使用不同的IntVar,并使用callback 函数通过调用按钮上的getvar 函数来打印变量。

我唯一的目标是查看Checkbutton 小部件的状态。

我正在使用 Tkinter Grid Geometry 管理器将小部件放置在 GUI 上。这是产生错误的MCVE 示例。

#!/usr/bin/env python

import Tkinter as tk

class Frame(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.buttons = dict() #number to button widget
        self.createWidgets(master)

    def printvar(self, button_number):
        print self.buttons[button_number].getvar()

    def createWidgets(self,master):
        for n in range(0,4):
            var = tk.IntVar()
            button = tk.Checkbutton(
                master,
                variable=var,
                command=lambda bn=n: self.printvar(bn)
            )
            button.grid(row=0, column=n)
            self.buttons[n] = button

window = Frame(tk.Tk())
window.mainloop()

代码生成四个编号按钮,将数字传递给lambda 函数,该函数在dict 中查找按钮并调用其对应的getvar 函数。

如果您运行示例代码,当您检查四个按钮中的任何一个时,它将产生以下错误。它在一个名为tktest.py的文件中

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1540, in __call__
    return self.func(*args)
  File "./tktest.py", line 20, in <lambda>
    command=lambda bn=n: self.printvar(bn)
  File "./tktest.py", line 12, in printvar
    print self.buttons[button_number].getvar()
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 513, in getvar
    return self.tk.getvar(name)
TclError: can't read "PY_VAR": no such variable

每个按钮都没有var 变量,因此我调用了getvar 方法。

检查每个 Checkbutton 小部件状态的任何替代方法也是可以接受的。

【问题讨论】:

    标签: python python-2.7 user-interface tkinter


    【解决方案1】:

    编辑:首先创建 n 个 var 以供使用,然后为每个按钮分配并保存在列表中。

    def createWidgets(self,master):
        self.vars=[]
        for n in range(0,4):
            var = tk.IntVar()
            self.vars.append(var)
    
        for n in range(0,4):
            button = tk.Checkbutton(
                master,
                variable=self.vars[n],
                command=lambda bn=n: self.printvar(bn)
            )
            button.grid(row=0, column=n)
            self.buttons[n] = button
    

    然后你可以改变你的方法来调用这个数字的var

    def printvar(self, button_number):
        print "The button:{} is {}".format(button_number,self.vars[button_number].get())
    

    例如输出是:

    The button:2 is 0
    The button:2 is 1
    

    当 0 未选中而 1 选中时

    【讨论】:

    • 试试这个,会告诉你的
    猜你喜欢
    • 1970-01-01
    • 2017-05-15
    • 2018-04-23
    • 2018-10-26
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多