- 论坛徽章:
- 0
|
还记得我们上次的PyGtk的程序么。我们显示了一个光秃秃的窗口。而且不能关闭!呵呵。这样太不象话了。我们来看一个复杂一点的例子,顺便看一下PyGtk的事件处理机制:
- import gtk
- class Shell:
- def __init__(self):
- self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
- self.window.connect("destroy", self.destroy_event, None)
- self.window.connect("delete_event", self.delete_event, None)
- self.initContainer()
- self.window.add(self.container)
- self.container.show()
- self.window.show()
- def initContainer(self):
- self.helloButton = gtk.Button("Hello World")
- self.helloButton.connect("clicked", self.hello, None)
- self.quitButton = gtk.Button("Quit")
- self.quitButton.connect_object("clicked", gtk.Widget.destroy, self.window)
- self.container = gtk.HBox()
- self.container.add(self.helloButton)
- self.container.add(self.quitButton)
- self.helloButton.show()
- self.quitButton.show()
- return self.container
- def delete_event(self, widget, event, data = None):
- print "delete event caught"
- return False
- def destroy_event(self, widget, event, data = None):
- print "destroy event caught"
- gtk.main_quit()
- def hello(self, widget, event, data=None):
- print "Hello PyGtk World!"
- def main(self):
- gtk.main()
- print __name__
- if __name__ == "__main__":
- shell = Shell()
- shell.main()
复制代码
如果有Gtk编程经验的话,可以很容易读懂这段代码。其实Gtk的机制很简单,就是在某个widget上,为某一个特定的事件注册一个callback函数。当事件发生时,对应的callback事件会被调用。
对于delete_event,这个事件通常是由window manager来发出,点击窗口右上教的"X"就会触发这个事件。
对于connect_object(event, callback, widget)这个函数,其效果是这样的:
会被调用。
在本例子里,gtk.Widget.destroy(self.window)会被调用。而gtk.Widget.destroy(widget)的作用是向widget发出destroy信号。如果widget注册了这个signal的callback,本例中是Shell.destroy_event()函数。结果是程序的退出。 |
|