含有章节索引的中文 文章模板

::-- ehu4ever [2005-08-08 02:30:13]

1. 事件信号 和 函数调用的理论

Note
在GTK的2.0版本中,事件信号系统已经从GTK搬到了GLib。这其中眼花liao乱的细节咱就不管了,到时候再说吧。

在我们把helloworld.py详细解说一遍之前,我们有必要讨论一下事件信号 和 函数调用的概念。GTK+这个类库是遵循事件驱动理论的,也就是说它会在gtk.main()里standby,直到有什么事件发生,然后它就把控制权交到相应的功能模块手里。

这个所谓的“控制权”是怎么回事,它又是怎样传递的呢?这就要通过各个模块之间相系地发信号,这就是所谓的“事件信号”。设想一下,你按了一下鼠标,就这样,被你的鼠标点了一下的那个东西(widget比如一个按钮)就发出了一个相应的“事件信号”。GTK+的精髓也就是这么几句话。有些“事件信号”是各个widget所都有的(比如destroy),而有些是某一种widget特有的(比如toggle button的toggled)。

为了让一个按钮对事件有所反应,我们要给它建立一个事件处理器,这个处理器得知了有事发生之后,就调用了相应的功能模块。这个调用过程是由GtkWidget的一个method完成的:

handler_id = object.connect(name, func, func_data)

object是GtkWidget的一个实例,它会发出“事件信号”,第一个参数name是你想得知并反应的事件的名称。第二个参数func是对事件进行处理的函数,在这个事件发生时调用。第三个参数func_data是要传入func的数据。上面的语句返回一个handle_id,我们根据它对事件处理器进行一些操作,比如中断、挂起。

func就“回调函数”,它一般以这样的形式出现:

def callback_func(widget, callback_data):

widget是指向发出“事件信号”的那个家伙的指针,callback_data是指向传入“回调函数”的数据的指针(就是前面的func_data)。

如果“回调函数”是某一个类的method,则会是这样的形式:

def callback_meth(self, widget, callback_data):

self是执行这个method的对象实例,这和helloworld.py中用法是一样的。

Note
上面所说的只是“回调函数”的一般情况,有一些widget的特殊“事件信号”的处理需要特殊的参数。

在helloworld.py中的另外一种调用方式是:

handler_id = object.connect_object(name, func, slot_object)

connect_object()和connect()的区别在于callback function只用一个参数,而callback method要用两个参数:

  • def callback_func(object) def callback_meth(self, object)

object通常是一个widget。connect_object一般使用一个参数的callback_func作为事件处理函数。