我正在重写一个使用glade和PyGTK编写的旧Python程序的部分接口。在
程序相当复杂,部分功能在插件中,因此原作者在几个glade文件中组织了接口定义。另外,一些窗口定义了一个通用接口,然后专门化自带了适合通用GUI的小部件。在
我对如何正确使用
from gi.repository import Gtk
builder = Gtk.Builder()
builder是一个全局变量,它保存在我使用其add_from_file
方法传递给它的glade文件中定义的所有gtk对象。在
现在我想添加几个展开器,在折叠时显示一行信息,展开时显示图片和更多文本信息。在
这些展开器和主窗口都来自同一个picture_expander.glade
文件,大致如下所示:
正确的方法是什么?在
如果我将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,以便将其传递给全局生成器?重复和唯一的身份证?在
我看到的最后一个选择是离开格莱德,至少在程序上完成这一部分。在
您可以创建另一个
Gtk.Builder()
,并在一个文件中只加载一些对象(和子对象)。比如:相关问题 更多 >
编程相关推荐