2009-04-14 98 views
5

我有一个使用libglade的,并使用一个小项目下加载XML文件:什么是从使用libglade转换为GtkBuilder的步骤? (蟒蛇)

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上。

回答

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,不能确定是否t仍然是一样的),你只能调用connect_signals一次,在第一次调用期间没有连接的任何信号都不会被连接。这在林间空地是不同的,所以如果你以前依靠这个功能要小心。

5

托斯滕的答案是正确的,但不完整的一点点,所以在这里http://xkcd.com/979/的精神是我最近经过多次试验和错误结算的过程:

格莱德界面设计师打开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文件并手动删除,以消除他们造成的警告。