以之前的程序中, 我们介绍了"事件绑定". 还有另一种方式可以将事件处理器与一个控件进行绑定. 它被称为"命令绑定", 我们会在接下来的程序中看到它.
*命令绑定*
你应该记得在前一个程序中, 我们将''绑定在了我们的按钮控件上. 'Button'在鼠标事件中是'ButtonPress'的另一种叫法. 'ButtonPress'与'ButtonRelease'是不同的. 'ButtonPress'是鼠标按下的这个动作. *但并没有释放它*. 'ButtonRelease'是释放鼠标按键的动作 -- 让它弹起.
我们为了实现诸如"鼠标拖放"这样的特性, 必须要区分开鼠标的按下和释放操作.
但按钮并没有这种拖放的特性. 如果用户想拖放一个按钮, 那么他可能会先在一个按钮上按下鼠标, 再拖动鼠标到屏幕的另一个位置, 再放开鼠标. 这个很明显我们不能认为是按钮控件一次"push"操作. 我们判断控件是"push"操作, 必须确定用户按下鼠标后, -- 没有将鼠标从控件上移走 -- 再放开鼠标. *这样*才能被认为是按钮是在进行一次"push"操作.
在上个例子中, 我们只是简单的将'Button-1'事件绑定到了按钮上, 但在按钮的一次'push'操作中还是有很多复杂的概念值得我们注意一下的.
幸运的是, 有另一种绑定方式来支持这些复杂的情况. 它被称为"命令绑定", 因为它是用控件的'command'参数来实现的.
在本例中, 注意(1)和(2)的注释来了解一下命令绑定是如何完成的. 在这几行代码中, 我们用'command'参数来分别将button1和button2绑定到'self.button1Click'和'self.button2Click'上.
(3) (4)
注意一下事件处理器的定义方式. 它不同于之前的定义方式, 它们并不需要一个event对象参数. 这是因为命令绑定与事件绑定不同, 它不会自动的传入event对象. 当然这是有意义的. 一个命令绑定并不是将一个单独的事件绑定到处理器上. 它会绑定多个事件. 比如, 对于按钮控件来说, 它绑定了鼠标按下再抬起这样一个模式到一个处理器上. 如果是传入事件的话, 那它到底该传入哪个事件呢: ButtonPress还是ButtonRelease? 哪个都不对. 这就是为啥命令绑定不会传入event对象的原因.
我们在下个例子中, 会看到它们之间更多的不同之处, 但现在, 我们先搞定这个例子再说.
*程序示例*
当程序运行, 按钮跟上个程序中的没啥区别... 但他们的行为会很不同.
当用鼠标按其中某个按钮时, 你可以比较一下它们与之前的行为上的差别. 比如, 当在"OK"按钮上按下鼠标后, *不要立刻抬起*, 而是继续移动鼠标看看.
如果你在前一个例子中这么干的话, button1Click会立刻被调用, 你会马上看到打印的消息. 但在这个例子中这么干的话, 啥事也不会发生... 除非你放开鼠标. 当你松开鼠标时, 你才会看到打印的消息.
还有一点不同. 比较一下你按RETURN或空格键. 比如, 当用TAB将焦点放在"OK"按钮上时, 按空格或RETURN键.
在上个例子中, 按空格会没反应, 但按RETURN会改变按钮的颜色. 但在这个程序中, 正好反了 -- 按空格会改变按钮颜色, 但按RETURN却没反应.
我们在下个例子中再回头比较一下这些.
- from Tkinter import *
-
-
class MyApp:
-
def __init__(self, parent):
-
self.myParent = parent
-
self.myContainer1 = Frame(parent)
-
self.myContainer1.pack()
-
-
self.button1 = Button(self.myContainer1, command=self.button1Click) ### (1)
-
self.button1.configure(text="OK", background= "green")
-
self.button1.pack(side=LEFT)
-
self.button1.focus_force()
-
-
-
self.button2 = Button(self.myContainer1, command=self.button2Click) ### (2)
-
self.button2.configure(text="Cancel", background="red")
-
self.button2.pack(side=RIGHT)
-
-
-
def button1Click(self): ### (3)
-
print "button1Click event handler"
-
if self.button1["background"] == "green":
-
self.button1["background"] = "yellow"
-
else:
-
self.button1["background"] = "green"
-
-
def button2Click(self): ### (4)
-
print "button2Click event handler"
-
self.myParent.destroy()
-
-
-
-
root = Tk()
-
myapp = MyApp(root)
-
root.mainloop()
阅读(788) | 评论(0) | 转发(0) |