2

我需要将 Gtk2 用于一个项目。我将为此使用 python/ruby。问题是包装对我来说似乎有点神秘。我尝试使用 VBox,以便在我的窗口中有以下小部件(按以下顺序):

  • 菜单栏
  • 工具栏
  • 文本视图/编辑器控制

我已经设法“猜测”了我的方式pack_start并获得了我需要的布局,但我希望能够理解它。Ruby Gtk2上的文档似乎太不直观了(python 也是如此,因为它是相同的,只为 python 编写),你能解释一下吗?

此外,set_size_request当我使用pack_start. 这是为什么 ?

4

1 回答 1

14

盒子包装真的很简单,所以也许你没有理解它是因为你想象它比它更复杂。

布局要么是垂直的(像一堆砖头),要么是水平的(像一群人)。该布局中的每个元素都可以扩展或不能扩展。

水平(HBox)

[widget][widget][widget][widget]

垂直(VBox)

[widget]
[widget]
[widget]
[widget]

例如,一个带有两个按钮的水平布局(HBox),代码如下:

import gtk
box = gtk.HBox()
b1 = gtk.Button('button1')
b2 = gtk.Button('button2')
box.pack_start(b1)
box.pack_start(b2)

现在,由于包装的默认设置是 have expand=True,添加到框中的两个按钮都将展开,它们将各自占据一半的区域。不管容器大小。我认为这是“有弹性的”。

扩展小部件:

[[    widget    ][    widget    ]]

因此,如果您希望其中一个按钮不展开,您可以这样打包:

box.pack_start(b1, expand=False)

非扩展小部件:

[[widget][        widget        ]]

然后按钮将只占用它需要绘制自己的空间:文本 + 边框 + 阴影 + 图像(如果有)等。另一个按钮将扩展以填充剩余区域。通常,按钮不需要展开,因此更真实的情况是您希望展开以填充窗口的 TextArea。

另一个可以传递pack_start的参数是填充参数,通常可以忽略。在这里说 if expand=Falsethenfill参数被完全忽略就足够了(因为在那种情况下它没有意义)。

你提到的另一件事是set_size_request。我通常会说这不是一个好主意。我说一般,因为在某些情况下您需要使用它。但是对于刚开始打包 GTK+ 用户界面的人,我强烈建议不要使用它。一般来说,让盒子和其他容器为您处理您的布局。set_size_request并不完全符合您的预期。它不会改变小部件的大小,而只会改变它需要多少空间。它可能会使用更多,甚至可以拉伸以填充更大的空间。它很少会小于请求,但同样因为它只是一个“请求”,所以不能保证请求会被满足。

于 2009-03-21T09:29:09.557 回答