gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:50:11 25 4
gpt4 key购买 nike

我正在重写使用 glade 和 PyGTK 编写的旧 Python 程序的部分界面。

程序比较复杂,部分功能在插件中,所以原作者将接口(interface)定义整理在几个glade文件中。此外,一些窗口定义了一个通用界面,然后专门化带有适合通用 GUI 的自己的小部件。

我对如何使用

正确地做到这一点感到困惑
from gi.repository import Gtk
builder = Gtk.Builder()

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 容器的每个扩展器,我创建一个新的构建器,我将相同的文件传递给它,然后询问新的builder 给我 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?

我看到的最后一个选择是不理会林间空地,至少以编程方式完成这一部分。

最佳答案

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

关于python - 重复插入从 glade 文件生成的相同 gtk 对象的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29882322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com