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

全部博文(26)

文章存档

2012年(4)

2011年(19)

2010年(3)

我的朋友

分类: Python/Ruby

2011-04-27 14:17:42

在上个例子中, 我们介绍了一下"命令绑定", 并比较了一下它与事件绑定的一些不同点. 在本例中, 我们会在细节上重新看看这些不同.

*"命令"到底绑定了什么事件?*

在前个例子中, 如果你用TAB将焦点放在了"OK"按钮上, 那么按空格会使按钮变色, 但按RETURN却没反应.

发生这种情况的原因是"command"参数为按钮控件提供了一个与鼠标事件通知一样的键盘事件通知. 对于按钮控件而言这样的键盘通知是按空格, 而不是按RETURN. 所以通过使用命令绑定, 按空格会使OK按钮改变颜色, 而按RETURN却没反应.

这种行为(起码对于使用windows的人来说)似乎不太正常. 这句话的意思是说如果你打算使用命令绑定的话, 那么就应该明白你到底绑定了什么命令. 也就是说, 你最好知道什么键和/或鼠标操作会触发这种命令.

不幸的是, 这完全决定于tk源码是如何实现的. 如果想了解更多的信息, 你可以看看一些关于tk或tkinter的书(Brent Welch的"Practical Programming in Tcl and Tk"这本就讲的很好). tk的文档一般, 但胜在有在线的可以看. 对于Tcl 8.4版, 它的在线手册在:

   

你还应该了解, 不是所有的控件都支持'command'参数. 大部分按钮控件(如RadioButton, CheckButton等)还是支持的. 还有一些提供了类似的参数(如scrollcommand). 不过你最好还是亲自看看各个控件到底支不支持命令绑定. 最后学习'command'参数的全部意义还是在于你会用它. 它会改善你的程序, 并且会让你的码农生活过得更惬意一些.

*同时使用事件绑定和命令绑定*

在上个例子中, 我们看到命令绑定与事件绑定不同, 它不会自动的传入event对象. 当你想要同时使用命令绑定和事件绑定将事件处理器与控件绑定在一起时, 这会使事情变得有点复杂.

举个例子, 在本例中我们很想让所有的按钮同时响应空格和RETURN. 但这么做的话, 我们就必须用事件绑定来绑定, 就像我们之前的例子中做的那样.

对于这个问题, 我们有很多解决办法, 但最简单的是写两个事件处理器. "真正"的事件处理器(2)使用'command'绑定, 而且它不需要event对象.

另一个处理器(3)仅仅是真正的处理器的一个封装. 这个封装函数会接受一个event对象参数, 但会忽略它并调用真正的处理函数. 它与真正的事件处理器名字一样, 只不过多了一个'_a'的后缀.

*代码示例*

运行程序, 界面与前一个例子基本一样, 只不过按钮会同时响应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)
  9.         self.button1.bind("", self.button1Click_a) ### (1)
  10.         self.button1.configure(text="OK", background= "green")
  11.         self.button1.pack(side=LEFT)
  12.         self.button1.focus_force()
  13.         
  14.         self.button2 = Button(self.myContainer1, command=self.button2Click)
  15.         self.button2.bind("", self.button2Click_a) ### (1)
  16.         self.button2.configure(text="Cancel", background="red")     
  17.         self.button2.pack(side=RIGHT)
  18.         
  19.     def button1Click(self): ### (2)
  20.         print "button1Click event handler"
  21.         if self.button1["background"] == "green":
  22.             self.button1["background"] = "yellow"
  23.         else:
  24.             self.button1["background"] = "green"
  25.     
  26.     def button2Click(self): ### (2)
  27.         print "button2Click event handler"
  28.         self.myParent.destroy()
  29.   
  30.     def button1Click_a(self, event): ### (3)
  31.         print "button1Click_a event handler (a wrapper)"
  32.         self.button1Click()
  33.                 
  34.     def button2Click_a(self, event): ### (3)
  35.         print "button2Click_a event handler (a wrapper)"
  36.         self.button2Click()
  37.                 
  38.                             
  39. root = Tk()
  40. myapp = MyApp(root)
  41. root.mainloop()
阅读(717) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~