在同一个窗口小部件上多次使用 .add()

在同一个窗口小部件上多次使用 .add()

我在 Reddit 上问了这个问题,并被引导到这里。 http://www.reddit.com/r/Ubuntu/comments/vhadl/quickly_dynamic_ui/

不幸的是,我遇到了同样的问题,问题似乎在于你只能在小部件上使用 .add() 一次。所以这是我的代码,

self.ui.labels = []
for titles in entries:
    label = Gtk.Label()
    self.ui.labels.append(label)         
    self.ui.viewport1.add(self.ui.labels[-1])
self.ui.paned1.show_all()

现在,为了好玩,我决定“如果我手动做的话会发生什么……”

self.ui.viewport1.add(Gtk.Label())
self.ui.viewport1.add(Gtk.Button())
self.ui.viewport1.add(Gtk.Entry())

对于我的第一个代码片段,我收到此错误,

Gtk-CRITICAL **: gtk_viewport_add: assertion gtk_bin_get_child (bin) == NULL' failed

由于列表条目的长度可能有所不同,因此错误发生的次数未知,但对于我的第二个代码片段,它恰好发生了两次。这意味着当我使用 viewport1.add() 时,它第一次成功,但之后的所有添加都会收到上述错误。

所以我的问题是,在 Python 中有没有办法在同一个小部件上多次使用 .add()?

答案1

Gtk 有不同类型的容器。现在,您正在使用GtkBin 容器,这是一种仅支持单个子项的容器。您需要一个支持多个子项的容器。为此,只需创建一个您选择的容器并将其添加到视口(就像一个普通的小部件一样)。这里有几个选择,它们都列在有关容器的 Gtk 文档

一种方法是使用图形框

self.ui.labels = []
for titles in entries:
    label = Gtk.Label()
    self.ui.labels.append(label)         
    self.ui.viewport1.add(self.ui.labels[-1])
self.ui.paned1.show_all()

# First, we need to create a box to hold all our widgets
box = Gtk.Box()
box.set_orientation(Gtk.Orientation.VERTICAL)

# Now add our widgets to the box, one by one, from the bottom
box.add(Gtk.Label())
box.add(Gtk.Button())
box.add(Gtk.Entry())

# We need to add the box to the viewport
self.ui.viewport.add(box)

box.show_all()

掌握了这些之后,你可能想要尝试一些其他功能。GtkBox 的 pack_start 和 pack_end 函数让你可以控制你添加的每个小部件,而不是盲目地将小部件添加到框中。你可以设置是否为子项分配所有可用空间,以及在其周围放置多少空间。在某些情况下,你可能会对以下内容感兴趣网格,这是一个功能更强大的容器,支持多行和多列。

相关内容