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如何在不对变量进行任何操作的情况下获取 的值?我应该避免为其分配变量吗?
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>
| 归档时间: |
|
| 查看次数: |
1894 次 |
| 最近记录: |