PyGTK 连接信号

1 投票
1 回答
1941 浏览
提问于 2025-04-16 02:08

好的,我这里有一个小测试程序:

这个程序是在我通过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类型的实例,它的属性比如说有upperlowerisalpha等等,这些和你可能感兴趣的事情完全没有关系。那么你为什么希望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的方法,通过反射机制,这个方法会被用作窗口销毁时触发的信号的处理函数。

撰写回答