如何从小部件中获取()小部件的 IntVariable 值?

Sha*_*ama 2 python tkinter python-2.7

我试图Tkinter.Checkbutton使用 获取 a 变量的值.get(),但出现错误。

import Tkinter as tk

class myApp(tk.Tk):
    def __init__(self, parent):
        tk.Tk.__init__(self, parent)
        self.parent = parent
        self.grid()
        self.var = tk.IntVar()
        self.cb = tk.Checkbutton(self.parent, variable=self.var)
        self.cb.bind('<Button-1>', self.useValue)
        print self.var.get() # works
        print self.cb.get() # does not work
        print self.cb.cget('variable') # prints something like PYNUMVAR1 
        print self.cb.cget('variable').get() # error I mention below
        print self.cb.var.get() # error
        print self.cb.val.get() # error

    def useValue(self, event):
        print event.widget.cget('variable').get()) # why not?

if __name__ == '__main__':
    runit = myApp(None)
    runit.mainloop()
Run Code Online (Sandbox Code Playgroud)

我尝试了在 stackoverflow 和其他教程网站上看到的所有内容的大量组合。我得到的错误是:

import Tkinter as tk

class myApp(tk.Tk):
    def __init__(self, parent):
        tk.Tk.__init__(self, parent)
        self.parent = parent
        self.grid()
        self.var = tk.IntVar()
        self.cb = tk.Checkbutton(self.parent, variable=self.var)
        self.cb.bind('<Button-1>', self.useValue)
        print self.var.get() # works
        print self.cb.get() # does not work
        print self.cb.cget('variable') # prints something like PYNUMVAR1 
        print self.cb.cget('variable').get() # error I mention below
        print self.cb.var.get() # error
        print self.cb.val.get() # error

    def useValue(self, event):
        print event.widget.cget('variable').get()) # why not?

if __name__ == '__main__':
    runit = myApp(None)
    runit.mainloop()
Run Code Online (Sandbox Code Playgroud)

它应该是一个IntVar,而不是一个_tkinter.Tcl_Obj没有属性的对象,当我尝试时,它会引发如下get属性错误:self.var

print self.var.crumpet()
Run Code Online (Sandbox Code Playgroud)

控制台让我知道它也是这种类型的对象。(它在我的第一个实验中做到了这一点,但我无法让它在IntVar上面示例代码中的实例上重新创建此错误消息,所以我认为这可能是错误的。)

我知道我可以只使用get()on self.var,但是如果我通过事件参数将小部件传递给回调函数,我希望能够获取它的值。

Checkbutton如何在不对变量进行任何操作的情况下获取 的值?我应该避免为其分配变量吗?

Bry*_*ley 7

print event.widget.cget('variable').get()) # 为什么不呢?

这只是 tkinter 的限制。从概念上讲,它应该可以工作,并且您可以在 tcl/tk 中执行相同的操作,但在 tkinter 中不起作用。

换句话说,这是一个错误,无论是在 tkinter 的设计中还是在它的实现中,我不确定是哪个。

我到底怎样才能获得 Checkbutton 的值而不需要对变量做任何事情呢?我应该避免为其分配变量吗?

一个简单但有效的解决方案是附加对小部件的引用:

class myApp(tk.Tk):
    def __init__(...):
        ...
        self.cb.var = self.var
        ...
    def useValue(self, event):
        print event.widget.var.get()
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是记录不足的getvar方法,该方法采用 tcl 变量名称作为参数并返回值。

例如:

def useValue(self, event):
    widget = event.widget
    varname = str(widget.cget("variable"))
    print widget.getvar(varname)
Run Code Online (Sandbox Code Playgroud)

注意:绑定到意味着您的回调将在设置或取消设置检查按钮之前<Button-1>被调用。它将始终显示以前的值。要么绑定到变量,要么对变量进行跟踪。后者更可取,因为如果用户通过键盘更改复选按钮,则不会触发绑定。<ButtonRelease-1><ButtonRelease-1>