2015-04-26 32 views
4

我正在重寫使用glade和PyGTK編寫的舊Python程序的接口的一部分。重複插入從glade文件生成的相同gtk對象的副本

的程序是相當複雜的功能部件是插件,所以原作者幾個空地文件已組織的接口定義。另外,某個窗口定義了一個通用接口,然後專門化將自己的窗口小部件放在通用GUI中。

我有正確使用

from gi.repository import Gtk 
builder = Gtk.Builder() 

的建設者,一個全局變量如何做這困惑,持有的林間空地的文件,我使用它的方法add_from_file它傳遞定義的所有GTK對象。

現在我想添加一些擴展,呈現出倒塌,圖片和多個文本信息時,當擴張的信息一條線。

這些擴展,並從主窗口的同一picture_expander.glade文件來全,看起來大致是這樣的:

<interface> 
    <object class="GtkWindow" id="picture_preview_window"> 
    <child> 
     <object class="GtkScrolledWindow" id="scrolledwindow2"> 
     <child> 
      <object class="GtkViewport" id="viewport1"> 
      <child> 
       <object class="GtkBox" id="notes_expander_box"> 
       <property name="orientation">vertical</property> 
       <child> 
        <placeholder/> 
       </child> 
       </object> 
      </child> 
      </object> 
     </child> 
     </object> 
    </child> 
    </object> 
    <object class="GtkBox" id="notes_box"> 
    <property name="orientation">vertical</property> 
    <child> 
     <object class="GtkExpander" id="notes_expander"> 
     <child> 
      <object class="GtkBox" id="vbox2"> 
      <property name="orientation">vertical</property> 
      <child> 
       <object class="GtkTable" id="table1"> 
       <property name="n_columns">2</property> 
       <child> 
        <object class="GtkLabel" id="label3"> 
        <property name="label" translatable="yes">User</property> 
        </object> 
        <packing> 
        <property name="x_options">GTK_FILL</property> 
        <property name="y_options"/> 
        </packing> 
       </child> 
       </object> 
       <packing> 
       </packing> 
      </child> 
      <child> 
       <object class="GtkBox" id="picture_frame"> 
       <property name="orientation">horizontal</property> 
       <child> 
        <placeholder/> 
       </child> 
       </object> 
      </child> 
      </object> 
     </child> 
     <child type="label"> 
      <object class="GtkLabel" id="label1"> 
      </object> 
     </child> 
     </object> 
    </child> 
    <child> 
     <object class="GtkSeparator" id="hseparator2"> 
     <property name="orientation">horizontal</property> 
     </object> 
    </child> 
    </object> 
</interface> 

什麼是做這種正確的方法是什麼?

如果我添加了picture_expander.glade的建設者,不管有多少次我添加它,生成器將創建一個對象,它的並不多份。如果我理解正確,這就是建造者類被引入的原因。但通過這種方式,我無法獲得可添加到我的notes_expander_box容器中的不同對象。

我看到不同的選項,但我不知道哪個是最安全和建議的。

我可能會克隆對象及其內容,但我該怎麼做? 以及這些ID會發生什麼,我如何引用新克隆的對象?

或者我現在正在做的工作,對於每個擴展器,我必須添加到notes_expander_box容器,我創建了一個新的構建器,然後讓我傳遞相同的文件,然後讓新的構建器給我這個對象對應的ID,所以我結束了一個新的對象,我可以將其添加到我的容器。

# -*- coding: utf-8 -*- 
#/usr/bin/env python 

from gi.repository import Gtk 
builder = Gtk.Builder() 

builder.add_from_file("picture_preview.glade") 

win = builder.get_object('picture_preview_window') 

ne = builder.get_object('notes_expander_box') 
for i in range(1, 4): 
    tb = Gtk.Builder() 
    tb.add_from_file("picture_preview.glade") 
    box = tb.get_object('notes_box') 
    ne.add(box) 

win.show_all() 
Gtk.main() 

仍然,我不認爲這是要走的路,因爲我插入的所有對象都具有相同的ID。

或者我應該嘗試有類似Jinja2產生對我來說空地XML,這樣我可以把它傳遞給全球的建設者?重複和唯一的ID?

我看到的最後一個選項是獨自離開林間空地和programmaticly至少做這部分。

+1

您目前的方法是我使用的方法,但我不知道是否有更好的方法。 +1,我希望儘快看到答案。 – ace

回答

1

您可以創建另一個Gtk.Builder()只有在一個文件中加載某些對象(和兒童)。像:

tb=Gtk.Builder() 
tb.add_objects_from_file(self.UI_XML, ("tab_header", "tab_body")) 
tb.add_from_file(self.UI_XML) 
tb.connect_signals(self) 

tab_header=tb.get_object("tab_header") 
tab_header.unparent() 

tab_body=tb.get_object("tab_body") 
tab_body.unparent() 

self.filetab.insert_page(tab_body, tab_header, -1)