使用GtkBuilder创建小部件

我正在使用Glade来设计一个带有小部件的Box,并在运行时将这些小部件加载到我的用户界面中。为了在运行时创建每个带有小部件的Box,我创建一个新的GtkBuilder,调用add_from_string方法并传入Glade创建的.ui文件中的文本,然后使用get_object("box1")从UI中返回的对象。
我知道我可以使用代码创建小部件,但目前我想使用Glade创建的.ui文件。然而,为了创建每个Box,实例化一个新的GtkBuilder对象和浪费的Window对象似乎效率低下。是否有一种更高效的方法来加载.ui文件,而不需要创建新的GtkWidget对象和浪费的Window对象呢?
谢谢, Vance
2个回答

如果你想在应用程序运行时向GUI中添加新的小部件,完全不需要创建一堆独立的.ui文件和对应的GtkBuilder。在代码中创建一个单独的小部件非常容易。

我假设你使用Python,因为你在问题中标记了pygtk

看一个简单的示例:

from gi.repository import Gtk

并且:

my_window = Gtk.Window()
my_button = Gtk.Button()
my_window.add(my_button)
my_window.show_all()

嗯,它本身并不能正常工作,但这是您可以创建新小部件的方法。有关特定小部件的详细信息,请访问这个优雅的教程/文档:http://python-gtk-3-tutorial.readthedocs.org/

谢谢rafalcieslak。是的,我正在使用Python。我正在从互联网API加载数据并在小部件中显示数据。因此,我需要在运行时生成小部件。我想使用Glade,因为它可以轻松地定位和设置小部件的属性;但为什么这种用法是“错误”的呢? - Vance T
@user72943:虽然Glade旨在使设计变得简单,但它只适用于静态界面,即运行时不会发生任何变化的界面。这是因为GtkBuilder(正如您所注意到的)如果每次需要一个新的小部件都要求它处理一个.ui文件,那么它将无法高效工作...在测试小部件布局和设计方面,Glade可能会有所帮助 - 但是,如果您希望应用程序高效运行(特别是如果您需要在运行时进行许多GUI更改),您将不得不以“传统方式”创建小部件。幸运的是,这非常简单,您不应该遇到麻烦。 - Rafał Cieślak

如果你想在运行时将不同的块放置在不同的区域,你可以构建一个包含大量窗口并重新父级化它们的Glade文件。例如,请查看我为这个其他问题所做的事情。