1

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

我对类不是很熟悉,还有什么我应该添加的吗?

如果上面的脚本不是一个类,那么我会使用:

refreshB = ttk.Button(optionFrame, text='Refresh', command=lambda: update )

哪个可以正常工作...

4

2 回答 2

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()这里不起作用,因为它是实例方法而不是类方法。不是因为使用了 lambda——尽管我不知道你为什么需要使用 lambda 函数。我的解决方案涉及您创建一个Monitor. 这很有用,因为它允许您控制其中的代码何时Monitor执行。(否则,您的类主体中的代码将在定义时执行。所有调用monitor()只是返回该类的一个实例monitor——它不执行代码主体)

于 2012-04-30T21:07:25.880 回答
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是无用的间接。为什么不直接将方法作为回调提供,而不是将其包装在 a 中lambda

refreshB = ttk.Button(optionFrame, text='Refresh', command=self.update )
于 2012-04-30T21:09:58.740 回答