使用事件处理程序调用方法

时间:2014-03-24 08:56:38

标签: python python-2.7 tkinter

为什么,如果我把#"正常"在button1Click()电话中调用方法bind,我的程序是否甚至没有启动?通过删除括号,问题得以解决。 我使用此程序作为参考:Thinking in Tkinter

另外,为什么我要将event参数添加到我的button1Click()方法?

from Tkinter import *
class MyApp:
    def __init__(self, parent):
        self.myParent = parent 
        self.myContainer1 = Frame(parent)
        self.myContainer1.pack()

        self.button1 = Button(self.myContainer1)
        self.button1.configure(text="OK", background= "green")
        self.button1.pack(side=LEFT)
        self.button1.bind("<Button-1>", self.button1Click) # <--- no () !

    def button1Click(self, event):
        self.button2 = Button(self.myContainer1, text="lol")
        self.button2.bind("<Button-1>", self.button1Click)
        self.button2.pack()

root = Tk()
myapp = MyApp(root)
root.mainloop()

2 个答案:

答案 0 :(得分:1)

您可以使用button1Click正常调用方法lambda。现在可能发生的事情就是无论如何都会被召唤。

例如:command=lambda:self.button1Click()

如果您愿意,可以通过将它们放在括号中来传递更多参数。

您需要使用event参数,因为无论何时绑定方法,您都会自动传递event对象。在你的情况下,它的两个参数 - 事件对象&amp; self

答案 1 :(得分:1)

bind()期望一些可调用且需要参数的东西。

如果您通过self.button1Click(),则会有效地传递None,因为这是此次调用所返回的内容。

由于可点击对象要执行调用,因此您不应该自己调用它。

所以,下一步:你传递它self.button1Click,然后按下按钮。那么给定的东西&#34;试图用事件对象作为参数调用,但是失败了,因为该方法没有为此做好准备。

所以你有两个选择:

  • 您可以修改方法,以便可以使用event对象调用它,例如def button1Click(self, event):
  • 或者将其包裹在lambda调用中:lambda event: self.button1Click()

在后一种情况下,您为bind()方法提供一个可调用的方法,该方法只接受一个参数,并在调用时进行调用(因此为())。