我有一个使用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上。
答案 0 :(得分: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
一次,在第一次调用期间未连接的任何信号将永远不会被连接。这在林间空地中是不同的,所以如果您以前依赖该功能,请务必小心。
答案 1 :(得分:5)
托斯滕的回答是正确的,但有点不完整,所以本着http://xkcd.com/979/的精神,这是我最近在经过多次试错之后确定的程序:
在Glade界面设计器中打开yada.glade。转到edit->项目并将项目类型更改为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文件并手动删除它们以消除它们引起的警告。