Chinaunix首页 | 论坛 | 博客
  • 博客访问: 72553
  • 博文数量: 26
  • 博客积分: 628
  • 博客等级: 中士
  • 技术积分: 315
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-22 11:57
文章分类

全部博文(26)

文章存档

2012年(4)

2011年(19)

2010年(3)

我的朋友

分类: Python/Ruby

2011-04-27 11:41:38

以之前的程序中, 我们介绍了"事件绑定". 还有另一种方式可以将事件处理器与一个控件进行绑定. 它被称为"命令绑定", 我们会在接下来的程序中看到它.

*命令绑定*

你应该记得在前一个程序中, 我们将''绑定在了我们的按钮控件上. '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却没反应.

我们在下个例子中再回头比较一下这些.

  1. from Tkinter import *

  2. class MyApp:
  3.     def __init__(self, parent):
  4.         self.myParent = parent
  5.         self.myContainer1 = Frame(parent)
  6.         self.myContainer1.pack()
  7.         
  8.         self.button1 = Button(self.myContainer1, command=self.button1Click) ### (1)
  9.         self.button1.configure(text="OK", background= "green")
  10.         self.button1.pack(side=LEFT)
  11.         self.button1.focus_force()

  12.         
  13.         self.button2 = Button(self.myContainer1, command=self.button2Click) ### (2)
  14.         self.button2.configure(text="Cancel", background="red")     
  15.         self.button2.pack(side=RIGHT)

  16.         
  17.     def button1Click(self): ### (3)
  18.         print "button1Click event handler"
  19.         if self.button1["background"] == "green":
  20.             self.button1["background"] = "yellow"
  21.         else:
  22.             self.button1["background"] = "green"
  23.     
  24.     def button2Click(self): ### (4)
  25.         print "button2Click event handler"
  26.         self.myParent.destroy()
  27.   
  28.         
  29.             
  30. root = Tk()
  31. myapp = MyApp(root)
  32. root.mainloop()
阅读(829) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~