如何将自定义对象的方法设置为窗口小部件回调

时间:2016-02-18 14:56:22

标签: python python-3.x tkinter

我已经定义了一个继承自Tkinter小部件的类 现在,我想将一个实际上是自定义对象方法的回调绑定到其父窗口小部件。我怎么能这样做?

目前,我有这样的事情:

from tkinter import *
from tkinter import ttk

class MyLabel(ttk.Label):

    def __init__(self, *args, **kwargs):
        ttk.Label.__init__(self, *args, **kwargs)
        self.ntimes = 0

    def test(self):
        self.ntimes += 1
        self.configure(
            text='Now the label has changed {} times'.format(self.ntimes)
        )

if __name__ == '__main__':
    root = Tk()
    f = ttk.Frame(root)
    f.grid()
    l = MyLabel(f, text='A label')
    l.grid()
    root.bind('<Left>', l.test)
    root.mainloop()

但是我收到了错误:

TypeError: test() takes 1 positional argument but 2 were given

注意:这只是一个简化的例子;我可以使用textvariable对象的ttk.Label选项来动态更新文本,但我想专注于我遇到的一般问题。

1 个答案:

答案 0 :(得分:2)

您需要定义test才能将event作为参数:

def test(self, event):
    ...

如果您不想这样做,可以将lambda函数绑定到回调:

root.bind('<Left>', lambda e: l.test())