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

全部博文(26)

文章存档

2012年(4)

2011年(19)

2010年(3)

我的朋友

分类: Python/Ruby

2011-04-27 16:56:15

在本程序中, 我们来看看这些...

*命令绑定的高级特性*

在tt075.py中, 我们用了'command'参数来将一个事件处理器与一个控件进行绑定. 比如, 在那个程序中我们这样写:

    self.button1 = Button(self.myContainer1, command=self.button1Click)

来将button1Click与button1控件进行绑定.

别馆我们用事件绑定来将按钮与事件进行绑定.

    self.button1.bind('

在之前的程序中, 两个按钮的事件处理器是完全不同的函数.

但假定情况不同了. 假定我们有几个按钮, 它们都触发*同一个*动作. 最好的处理办法是将所有按钮的事件都绑定到同一个事件处理器上. 每个按钮都会调用同一个事件处理器, 但传入不同的参数来告诉它该怎么处理.

这就是我们在这个程序中要做的.

*命令绑定*

在这个程序中, 我们有两个按钮, 并且使用'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'的那个图标).

现在来运行一下程序, 具体看看情况吧. 在下个程序中, 我们会解释为啥它会这样.

  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.         button_name = "OK"
  9.         self.button1 = Button(self.myContainer1,
  10.             command=self.buttonHandler(button_name, 1, "Good stuff!"))
  11.             
  12.         # self.button1.bind("", self.buttonHandler_a(event, button_name, 1, "Good stuff!"))
  13.         self.button1.configure(text=button_name, background="green")
  14.         self.button1.pack(side=LEFT)
  15.         self.button1.focus_force() # Put keyboard focus on button1
  16.         
  17.         button_name = "Cancel"
  18.         self.button2 = Button(self.myContainer1,
  19.             command=self.buttonHandler(button_name, 2, "Bad stuff!"))
  20.             
  21.         # self.button2.bind("", self.buttonHandler_a(event, button_name, 2, "Bad stuff!"))
  22.         self.button2.configure(text=button_name, background="red")
  23.         self.button2.pack(side=LEFT)
  24.                 
  25.         
  26.     def buttonHandler(self, arg1, arg2, arg3):
  27.         print " buttonHandler routine received arguments:", arg1.ljust(8), arg2, arg3
  28.         
  29.      def buttonHandler_a(self, event, arg1, arg2, arg3):
  30.         print "buttonHandler_a received event", event
  31.         self.buttonHandler(arg1, arg2, arg3)
  32.         
  33. print "\n"*100 # clear the screen
  34. print "Starting program tt077."                            
  35. root = Tk()
  36. myapp = MyApp(root)
  37. print "Ready to start executing the event loop."
  38. root.mainloop()
  39. print "Finished executing the event loop."
阅读(658) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~