类lambda回调NameError

时间:2012-04-30 20:57:21

标签: python class lambda callback nameerror

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

哪种方法可行......

2 个答案:

答案 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 )