类 lambda 回调名称错误



我做错了什么?我希望"刷新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 )

最新更新