我做错了什么?我希望"刷新B"按钮调用"更新"def,但我得到一个名称错误
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**
我对课程不是很熟悉,还有什么要补充的吗?
如果上面的脚本不是一个类,那么我会使用:
refreshB = ttk.Button(optionFrame, text='Refresh', command=lambda: update )
哪个工作正常...
将所有初始化代码放在初始化函数中。然后将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()
引用在这里不起作用,因为它是一个实例方法,而不是一个类方法。不是因为使用了lambda——尽管我不知道为什么你需要使用lambda函数。我的解决方案涉及您创建Monitor
的实例。这很有用,因为它允许您控制何时执行Monitor
中的代码。(否则,类主体中的代码将在定义时执行。调用monitor()
所做的只是返回类monitor
的实例 - 它不执行代码的主体)
你不应该在类中直接有副作用的代码。您几乎肯定希望所有代码都位于__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 )