从libglade转换到GtkBuilder的步骤是什么?(Python)
我有一个小项目,使用了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)
在我把项目转换成glade格式之后,我需要做哪些结构上的调整呢?我现在用的是Ubuntu 9.04。
2 个回答
Torsten的回答是对的,但有点不完整,所以我在这里分享一下我最近经过多次尝试后总结的步骤:
首先,打开yada.glade文件,这个文件是用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文件,手动删除它们,以消除它们引起的警告。
你需要使用 gtk.Builder
。这个类可以加载任意数量的用户界面文件,所以你需要手动添加这些文件,可以是文件也可以是字符串:
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
一次,第一次调用时没有连接的信号将永远不会被连接。这在 glade 中是不同的,所以如果你之前依赖这个功能,要小心哦。