pygtk glade 问题:为什么这个简单脚本不工作?

1 投票
1 回答
1244 浏览
提问于 2025-04-11 18:04

我正在用glade写一个小的pygtk应用程序,主要是用来搭建用户界面。我已经创建了几个窗口,它们都能正常工作,但这个窗口却出现了问题。我得到了以下的错误信息:

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    class TestClass:
  File "test.py", line 10, in TestClass
    self.wTree.signal_autoconnect(self)
NameError: name 'self' is not defined

这是test.py的内容:

#!/usr/bin/env python

import pygtk
import gtk
import gtk.glade

class TestClass:
    def __init__(self):
        self.wTree = gtk.glade.XML("test.glade")
        self.wTree.signal_autoconnect(self)

    def on_TestClass_destroy(self, widget, data):
        gtk.main_quit()

if __name__ == "__main__":
    window = TestClass()
    gtk.main()

这是glade文件,test.glade:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.4.5 on Fri Nov 21 08:53:53 2008 -->
<glade-interface>
  <widget class="GtkWindow" id="TestWindow">
    <property name="visible">True</property>
    <property name="title" translatable="yes">Test Window</property>
    <signal name="destroy" handler="on_TestClass_destroy"/>
    <child>
      <placeholder/>
    </child>
  </widget>
</glade-interface>

奇怪的是,如果我去掉signal_autoconnect(self)这个调用,窗口就能打开。但是如果我把这个调用换成"self.on_TestClass_destroy(self, None, None)",同样会出现NameError的错误。

我真的不明白为什么这个窗口不工作,因为我已经创建了几个其他的窗口类,它们都没问题。

这里有没有人能让下面的代码正常工作呢?

1 个回答

4

这段代码、窗口和信号连接在这里都运行得很好。

不过,在调用信号处理函数时有一个小问题。信号处理函数不应该有数据参数,因为只有小部件会作为参数传递。

def on_TestClass_destroy(self, widget):
    gtk.main_quit()

数据参数只是那些在连接时提供的,如果你需要额外的状态信息来处理信号的话。

撰写回答