python – 重复插入从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容器中的不同对象. 我看到了不同的选择,但我不知道哪个是最安全的建议. 我可能克隆对象及其内容,但我该怎么做? 或者,我现在正在做什么和工作,对于我必须添加到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,以便我可以将它传递给全局构建器?重复和唯一身份证? 我看到的最后一个选择是单独留下沼地,并至少以编程方式完成这一部分. 解决方法
您可以创建另一个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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |