【问题标题】:How to get() a widget's IntVariable value from the widget?如何从小部件中获取()小部件的 IntVariable 值?
【发布时间】:2018-01-08 22:58:44
【问题描述】:

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

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()

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

AttributeError: '_tkinter.Tcl_Obj' object has no attribute 'get'

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

print self.var.crumpet()

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

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

我怎样才能得到Checkbutton 的值而不必对变量做任何事情?我应该避免给它分配一个变量吗?

【问题讨论】:

    标签: python python-2.7 tkinter


    【解决方案1】:

    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()
    

    另一种解决方案是文档不足的 getvar 方法,该方法将 tcl 变量名称作为参数并返回值。

    例如:

    def useValue(self, event):
        widget = event.widget
        varname = str(widget.cget("variable"))
        print widget.getvar(varname)
    

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

    【讨论】:

    • 最后只是给了我的 cb 一个 cb.var 属性,我将它设置为复选框,它位于我的复选框列表中。我想要一些容易增加数量的东西。不过,你让我走上了正轨,谢谢。
    【解决方案2】:

    CheckButton的状态在self.var中表示,CheckButton对象没有任何get属性。

            print self.var.get() # Value of CheckButton state
            print self.cb.get() # Checkbutton doesn't have any attribute .get()
            print self.cb.cget('variable') # prints name value stored in tkinter
            print self.cb.cget('variable').get() # self.cb.cget('variable') doesn't have .get attribute
            print self.cb.var.get() # self.cb (checkButton) doesn't have any var attribute
            print self.cb.val.get() # self.cb.val was not declared before
    

    【讨论】:

      【解决方案3】:

      首先,意识到Checkbutton 没有value 选项。它有 onvalueoffvalue 选项,您也没有设置。下面的代码将onvalue 设置为Checkbutton,然后在标签上显示其onvalueoffvalue

      import tkinter as tk
      
      root = tk.Tk()
      
      cb = tk.Checkbutton(root, onvalue=32)
      on = tk.Label(root, text=cb['onvalue'])
      off = tk.Label(root, text=cb['offvalue'])
      
      cb.pack()
      on.pack()
      off.pack()
      
      root.mainloop()
      

      【讨论】:

        猜你喜欢
        • 2011-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-21
        • 2013-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多