我正在重寫使用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,我希望儘快看到答案。 – ace