在之前的程序中, 两个按钮的事件处理器是完全不同的函数.
但假定情况不同了. 假定我们有几个按钮, 它们都触发*同一个*动作. 最好的处理办法是将所有按钮的事件都绑定到同一个事件处理器上. 每个按钮都会调用同一个事件处理器, 但传入不同的参数来告诉它该怎么处理.
这就是我们在这个程序中要做的.
*命令绑定*
在这个程序中, 我们有两个按钮, 并且使用'command'参数来将按钮绑定到相同的事件处理器中 -- 'buttonHandler'调用. 我们传给buttonHandler三个参数: 按钮名字(保存在button_name变量中), 一个数, 一个字符串.
self.button1 = Button(self.myContainer1,
command=self.buttonHandler(button_name, 1, 'Good stuff!')
)
在一个"严肃"的程序中, buttonHandler必须要作一些"严肃"的事才行, 但在这个程序中它只是打印出它收到的参数而已.
*事件绑定*
说了一大堆命令绑定的东东. 那事件绑定呢?
你应该会注意到我们已经将绑定的代码已经注释掉了.
# self.button1.bind('', self.buttonHandler_a(event, button_name, 1, 'Good stuff!'))
这是个问题. 事件绑定会自动传入event参数 -- 但没有一种简单的办法将event参数像上面那样放在我们的参数列表中.
我们下个例子会再回到这儿来. 现在, 让运行起程序看看会发生啥.
*代码示例*
看代码, 这个程序写的很合理. 但当你运行的时候, 你会看到它工作的并不正确. buttonHandler甚至会在界面显示出来之前被调用. 实际上, 它被调用了*两次*.
而且当你在按钮上点击鼠标左键时, 也没什么反应 -- 'eventHandler'*没有*被调用.
注意要关闭程序需要按'close'图标(即打'x'的那个图标).
现在来运行一下程序, 具体看看情况吧. 在下个程序中, 我们会解释为啥它会这样.
- from Tkinter import *
-
-
class MyApp:
-
def __init__(self, parent):
-
self.myParent = parent
-
self.myContainer1 = Frame(parent)
-
self.myContainer1.pack()
-
-
button_name = "OK"
-
self.button1 = Button(self.myContainer1,
-
command=self.buttonHandler(button_name, 1, "Good stuff!"))
-
-
# self.button1.bind("", self.buttonHandler_a(event, button_name, 1, "Good stuff!"))
-
self.button1.configure(text=button_name, background="green")
-
self.button1.pack(side=LEFT)
-
self.button1.focus_force() # Put keyboard focus on button1
-
-
button_name = "Cancel"
-
self.button2 = Button(self.myContainer1,
-
command=self.buttonHandler(button_name, 2, "Bad stuff!"))
-
-
# self.button2.bind("", self.buttonHandler_a(event, button_name, 2, "Bad stuff!"))
-
self.button2.configure(text=button_name, background="red")
-
self.button2.pack(side=LEFT)
-
-
-
def buttonHandler(self, arg1, arg2, arg3):
-
print " buttonHandler routine received arguments:", arg1.ljust(8), arg2, arg3
-
-
def buttonHandler_a(self, event, arg1, arg2, arg3):
-
print "buttonHandler_a received event", event
-
self.buttonHandler(arg1, arg2, arg3)
-
-
print "\n"*100 # clear the screen
-
print "Starting program tt077."
-
root = Tk()
-
myapp = MyApp(root)
-
print "Ready to start executing the event loop."
-
root.mainloop()
-
print "Finished executing the event loop."