我做错了什么?我希望'refreshB'按钮调用'update'def,但我得到一个nameError而不是
class monitor():
def update(self):
print "Called"
mon = Tk()
mainFrame = Frame(mon)
mainFrame.grid(row=1, column=1)
optionFrame = Frame(mainFrame)
optionFrame.grid(row=1, column=1)
refreshB = ttk.Button(optionFrame, text='Refresh', command=lambda: update('self') )
refreshB.grid(row=1, column=1)
mon.mainloop()
monitor()
**NameError: global name 'update' is not defined**
我对Classes不是很熟悉,还有什么我应该添加的吗?
如果上面的脚本不是一个类,那么我会使用:
refreshB = ttk.Button(optionFrame, text='Refresh', command=lambda: update )
哪种方法可行......
答案 0 :(得分:1)
将所有初始化代码放在初始化函数中。然后,将update()
称为self.update()
。
class Monitor(object):
def update(self, event):
print "Called"
def __init__(self):
self.mon = Tk()
self.mainFrame = Frame(self.mon)
self.mainFrame.grid(row=1, column=1)
self.optionFrame = Frame(self.mainFrame)
self.optionFrame.grid(row=1, column=1)
self.refreshB = ttk.Button(self.optionFrame, text='Refresh', command=self.update)
self.refreshB.grid(row=1, column=1)
def run(self):
self.mon.mainloop()
monitor = Monitor()
monitor.run()
update()
引用在这里不起作用,因为它是一个实例方法而不是classmethod。不是因为使用了lambda - 虽然我不知道你为什么还需要使用lambda函数。我的解决方案涉及您创建Monitor
的实例。这很有用,因为它允许您控制Monitor
中的代码何时执行。 (否则你的类体中的代码在定义时执行。所有调用monitor()
都返回类monitor
的实例 - 它不执行代码的主体)
答案 1 :(得分:0)
你不应该真正拥有直接在类中具有副作用的代码。您几乎肯定希望所有代码都在__init__
函数中,而在创建monitor
对象后调用它:
def __init__(self):
mon = Tk()
etc...
接下来,update
是一个实例方法,因此必须在对象上调用它。你可能想要这个:
refreshB = ttk.Button(optionFrame, text='Refresh', command=lambda: self.update('self') )
但是,由于你的update
方法没有采用隐式self
参数之外的任何参数,你实际上可能想要这个:
refreshB = ttk.Button(optionFrame, text='Refresh', command=lambda: self.update() )
最后,lambda
是无用的间接。为什么不直接将该方法作为回调而不是将其包装在lambda
?
refreshB = ttk.Button(optionFrame, text='Refresh', command=self.update )