5.2.4 图形的事件处理

面向对象的概念是和事件驱动编程联系在一起的。所谓事件是指在程序执行过程中发生的事情,例如点击了鼠标左键、按下了键盘上的回车键之类。某个对象可以与特定事件绑定 在一起,这样当特定事件发生时,可以调用特定的函数来处理这个事件。

画布及画布上的图形都是对象,都可以与交互事件绑定,这样用户可以利用键盘、鼠标 来操作、控制画布和图形。第 8 章将详细介绍 Tkinter 的事件驱动编程,这里我们只用一个 简单例子展示画布和图形对象的事件处理能力。

【程序 5.1】eg5_1.py

from Tkinter import *
def canvasFunc(event):
    if c.itemcget(t,"text") == "Hello!": 
        c.itemconfig(t,text="Goodbye!")
    else:
        c.itemconfig(t,text="Hello!")
def textFunc(event):
    if c.itemcget(t,"fill") != "white": 
        c.itemconfig(t,fill="white")
    else:
        c.itemconfig(t,fill="black")
root = Tk()
c = Canvas(root,width=300,height=200,bg='white') 
c.pack()
t = c.create_text(150,100,text="Hello!") 
c.bind("<Button-1>",canvasFunc) 
c.tag_bind(t,"<Button-3>",textFunc) 
root.mainloop()

下面我们对此程序中与事件处理有关的几个要点进行说明。

事件绑定

对象 O 需要与特定事件 E 进行绑定,以便告诉系统当针对 O 发生了 E 之后该如何处理。 程序 5.1 的倒数第 3 行中,利用画布的 bind()方法将画布对象 c 与鼠标左键点击事件"<Button-1>"进行了绑定,其中告诉系统当用户在画布 c 上点击鼠标左键时,就去执行 函数 canvasFunc()。

程序 5.1 的倒数第 2 行中,利用画布的 tag_bind()方法将画布对象 c 上的图形项(文 本)t 与鼠标右键点击事件"<Button-3>"进行了绑定,其中告诉系统当用户在文本 t 上 点击鼠标右键时,就去执行函数 textFunc()。

事件处理函数

程序员可以自定义对事件的处理函数。

程序 5.1 中定义了 canvasFunc()函数用于处理画布上的鼠标左键点击事件,其功能 是改变文本 t 的内容:如果当前内容是"Hello!"就改成"Goodbye!",如果当前是 "Goodbye!"就改成"Hello!"。每当用户在画布上点击鼠标左键时就执行一次这个函数, 形成文字内容随鼠标点击而切换的效果。

程序 5.1 中还定义了 textFunc()函数用于处理文本上的鼠标右键点击事件,其功能是 改变文本 txt 的颜色:如果当前不是白色则改为白色,否则改为黑色。每当用户在文本上 点击鼠标右键时就执行一次这个函数,形成文本随鼠标点击而出没的效果。注意画布背景色 是白色,因此将文本设置为白色就相当于隐去文本。

主事件循环

程序 5.1 中并没有调用上述两个事件处理函数的语句,它们是由系统根据所发生的事件 而 自 动调用 的 。系统 如 何知道 现 在发生 了 什么事 件 呢?程 序 5.1 中最后一 行 root.mainloop()的意义是进入根窗口的主事件循环。执行了这一条语句之后,系统就会 自行监控在根窗口上发生的各种事件,并触发相应的处理函数。

以上对 Tkinter 的事件处理作了简单介绍,如果读者仍有疑惑,第 8 章中有详细介绍。