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

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

我已经成功地“猜测”了我的方式 pack_start 并获得我需要的布局,但我希望能够理解它。文档位于 红宝石GTK2 似乎太不直观了(Python 也是如此,因为它是相同的,只是为 Python 编写的),你能解释一下吗?

还, set_size_request 当我添加一个组件时并不总是有效 pack_start. 。这是为什么 ?

有帮助吗?

解决方案

盒子包装是 真的 简单,所以也许你无法理解它是因为你想象它比实际情况更复杂。

布局可以是垂直的(如一堆砖)或水平的(如一队人)。该布局中的每个元素都可以展开,也可以不展开。

水平(HBox)

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

垂直(垂直框)

[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)

现在,由于打包的默认设置是 expand=True, ,添加到框中的两个按钮都会展开,并且各自占据一半的区域。无论容器的大小如何。我认为这是“有弹性的”。

扩展小部件:

[[    widget    ][    widget    ]]

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

box.pack_start(b1, expand=False)

非扩展小部件:

[[widget][        widget        ]]

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

可以传递的另一个参数 pack_start 是填充参数,一般可以忽略。这里只要说如果 expand=False 那么 fill 参数被完全忽略(因为在这种情况下它没有意义)。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top