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

2024-05-15 05:54:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我对如何正确使用

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

builder是一个全局变量,它保存在我使用其add_from_file方法传递给它的glade文件中定义的所有gtk对象。在

现在我想添加几个展开器,在折叠时显示一行信息,展开时显示图片和更多文本信息。在

这些展开器和主窗口都来自同一个picture_expander.glade文件,大致如下所示:

^{pr2}$

正确的方法是什么?在

如果我将picture_expander.glade添加到构建器中,无论添加多少次,构建器都将创建一个对象而不是它的多个副本。如果我理解正确的话,这正是引入builder类的原因。但是通过这种方式,我无法获得可以添加到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的方法为我生成gladexml,以便将其传递给全局生成器?重复和唯一的身份证?在

我看到的最后一个选择是离开格莱德,至少在程序上完成这一部分。在


Tags: 文件对象方法from程序boxaddgtk
1条回答
网友
1楼 · 发布于 2024-05-15 05:54:36

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

相关问题 更多 >

    热门问题