5

我有一个使用 libglade 并使用以下内容加载 xml 文件的小项目:

self.gladefile = "sdm.glade"
self.wTree = gtk.glade.XML(self.gladefile) 
self.window = self.wTree.get_widget("MainWindow")
if (self.window):
    self.window.connect("destroy", gtk.main_quit)
dic = { "on_button1_clicked" : self.button1_clicked, 
        "on_MainWindow_destroy" : gtk.main_quit}
self.wTree.signal_autoconnect(dic)

在林间空地转换我的项目后,我需要进行哪些结构更改?我在 Ubuntu 9.04 上。

4

2 回答 2

11

你需要gtk.Builder改用。此类可以加载任意数量的 UI 文件,因此您需要手动添加它们,无论是作为文件还是作为字符串:

self.uifile = "sdm.ui"
self.wTree = gtk.Builder()
self.wTree.add_from_file(self.uifile)

而不是get_widget,只需get_object在构建器类上使用:

self.window = self.wTree.get_object("MainWindow")
if self.window:
    self.window.connect("destroy", gtk.main_quit)

要连接信号,只需使用connect_signals,它也需要一个字典:

dic = { "on_button1_clicked" : self.button1_clicked, 
    "on_MainWindow_destroy" : gtk.main_quit}
self.wTree.connect_signals(dic)

曾经是这种情况(至少在 GTK+ 2.12 中,不确定它是否仍然相同)您只能调用connect_signals一次,在第一次调用期间未连接的任何信号将永远不会连接。这在林间空地是不同的,所以如果你以前依赖过这个功能,请小心。

于 2009-04-14T21:57:11.477 回答
5

Torsten 的回答是正确的,但有点不完整,所以本着 http://xkcd.com/979/的精神,这是我最近经过反复试验后确定的程序:

在 Glade 界面设计器中打开 yada.glade。转到编辑->项目并将项目类型更改为 GtkBuilder 并确保它针对最新版本(撰写本文时为 2.24)。保存文件,确保它以 GtkBuilder 格式保存,并将名称从 yada.glade 更改为 yada.ui

打开 yada.py 并更改以下代码:

gladefile = relativize_filename(os.path.join("glade", "yada.glade"))
self.wTree = gtk.glade.XML(gladefile, self.windowname)

到:

uifile = relativize_filename(os.path.join("glade", "yada.ui"))
self.wTree = gtk.Builder()
self.wTree.add_from_file(uifile)

同样将所有实例更改self.wTree.get_widget(...)self.wTree.get_object(...)

更改self.wTree.signal_autoconnect(dic)self.wTree.connect_signals(dic)

如果您的代码依赖于界面设计器中分配给小部件的名称,请更改widget.get_name()gtk.Buildable.get_name(widget). widget.get_name()现在只返回小部件类型。编辑:您还需要更改widget.set_name('my_widget')gtk.Buildable.set_name(widget, 'my_widget').

删除import gtk.glade

我发现在 yada.ui xml 文件中定义了许多未使用的信号,我不得不打开 xml 文件并手动删除它们以消除它们引起的警告。

于 2011-11-29T22:01:27.803 回答