为什么,如果我把#"正常"在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()
答案 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 event: self.button1Click()
。在后一种情况下,您为bind()
方法提供一个可调用的方法,该方法只接受一个参数,并在调用时进行调用(因此为()
)。