PyGTK 连接信号
好的,我这里有一个小测试程序:
这个程序是在我通过gtk.Builder加载的文件里。
<object class="GtkWindow" id="mainWindow">
<property name="default_width">500</property>
<property name="default_height">250</property>
<signal name="delete_event" handler="endProgram" />
</object>
然后我使用了这个:
def endProgram ():
print "end";
rofl = gtk.Builder();
rofl.add_from_file("mainwindow.ui");
win = rofl.get_object("mainWindow");
rofl.connect_signals("mainWindow");
win.show_all();
gtk.main();
但是当我运行的时候,它却抱怨说我缺少了一个主窗口对象的处理器。我也试过用 rofl.connect_signals(win); 这个方法。
1 个回答
3
根据文档,connect_signals
这个函数需要一个映射或实例作为参数,
它会利用Python的一些特性,查看这个对象的键(如果是映射)或者属性(如果是实例),然后尝试把它们和界面描述中给出的信号处理函数名称进行匹配。每个匹配到的键或属性所引用的回调函数会被连接到相应的信号上。
举个例子,当你传入"mainwindow"
,这是一个str
类型的实例,它的属性比如说有upper
、lower
、isalpha
等等,这些和你可能感兴趣的事情完全没有关系。那么你为什么希望win
的属性来处理信号呢?换句话说,你希望connect_signals
能做什么呢?
一个更典型的使用例子可以在这个SO问题和这个教程中找到,其中提供了以下Python示例:
class TutorialTextEditor:
def on_window_destroy(self, widget, data=None):
gtk.main_quit()
def __init__(self):
builder = gtk.Builder()
builder.add_from_file("tutorial.xml")
self.window = builder.get_object("window")
builder.connect_signals(self)
如你所见,这里connect_signals
是以典型的方式使用的——也就是说,传入一个对象(self
),这个对象有一个on_window_destroy
的方法,通过反射机制,这个方法会被用作窗口销毁时触发的信号的处理函数。