重复插入从glade文件生成的相同gtk对象的副本



我正在重写一个使用glade和PyGTK编写的旧Python程序的部分接口。

该程序相当复杂,部分功能在插件中,因此原作者在几个glade文件中组织了接口定义。此外,一些窗口定义了一个通用接口,然后专门化自带适合通用GUI的小部件。

我对如何正确使用感到困惑

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

构建器是一个全局变量,它保存了我使用其add_from_file方法传递给它的glade文件中定义的所有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之类的东西为我生成glade xml,这样我就可以将它传递给全局生成器吗?重复和唯一ID?

我看到的最后一个选择是让glade一个人呆着,至少程序化地完成这一部分。

您可以创建另一个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)

最新更新