【问题标题】:Putting Horizontal Box inside a Vertical Box in Gtk+3在 Gtk+3 中将水平框放在垂直框内
【发布时间】:2026-02-14 14:05:02
【问题描述】:

我在 python 中使用 GTK+3 制作了以下 GUI:

    Gtk.Window.__init__(self, title="File Manager")
    self.set_size_request(800, 600)
    self.set_position(Gtk.WindowPosition.CENTER)

    vertical_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
    self.add(vertical_box)

    menu_bar = create_menu_bar()
    vertical_box.pack_start(menu_bar, False, False, 0)

    tool_bar = create_tool_bar()
    vertical_box.pack_start(tool_bar, False, False, 0)

    horizontal_box = Gtk.Box()
    vertical_box.pack_start(horizontal_box, False, True, 0)

    side_bar = create_side_bar()
    horizontal_box.pack_start(side_bar, False, False, 0)
    horizontal_box.set_halign(1.0)

    list_view = create_list_view()
    horizontal_box.pack_start(list_view, True, True, 0)

它基本上是一个文件管理器。问题是 list_view 中的项目占用了它所需的最小空间。如下图所示:

在第一张图片中,列表占据了整个屏幕的空间,但仍然在大小列附近有一个白色边框。

在第二张图片中,即使侧边栏缩小了,列表中的项目也会减少。

侧边栏占用list_view的大小,如何避免?

如何正确格式化我的 gui,以及如何为 list_view 的列提供适当的填充和间距?

【问题讨论】:

标签: python python-3.x user-interface gtk gtk3


【解决方案1】:

首先,你应该直接设置hexpand和vexpand为list_view

list_view.set_hexpand (True)
list_view.set_vexpand (True)

第二个:set_halign 和 set_valign 需要的不是数字,而是枚举值:

horizontal_box.set_halign(Gtk.Align.FILL)

关于列宽:GtkTreeViewColumn 有很多方法来控制大小:

set_sizing
set_resizable
set_fixed_width
set_min_width
set_max_width

【讨论】:

  • 我做了 set_halign(Gtk.Align.START)。我的 side_bar 现在已正确对齐。我在 ScrolledWindow 中添加 list_view 并且水平输出非常小。我应该如何解决这个问题?
  • “小”不是可衡量的。如果您没有更改滚动策略,则应遵循尺寸请求(800 x 600)。
  • 现在我使用 treeviewcolumn.set_expand(True) 和 scrolled_window.set_min_content_width(1000) 解决了这个问题
  • 意味着它太小以至于什么都看不见,并且存在水平滚动条。我还尝试了 scrolled_window.set_policy(hscrollbar_policy=Gtk.PolicyType.NEVER, vscrollbar_policy=Gtk.PolicyType.AUTOMATIC),但在此之后它只是使用了所需的最小空间,在“大小”列附近创建了白色边框,如图所示以上。