为什么我的 SearchEntry 不会在其 SearchBar 内增长?

Why won't my SearchEntry grow inside its SearchBar?

我里面有一个Gtk.SearchBar with a Gtk.SearchEntry。我希望 SearchEntry 使用所有可用的(水平)space,因此我设置了 entry.props.hexpand = Trueentry.props.halign = Gtk.Align.FILL。但出于某种原因,SearchBar 不会授予它任何额外的 space,并且 Entry 保持很小。

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

window = Gtk.Window()
window.set_size_request(800, 300)

search_bar = Gtk.SearchBar()
search_bar.props.search_mode_enabled = True
search_bar.props.show_close_button = True
window.add(search_bar)

entry = Gtk.SearchEntry()
entry.props.hexpand = True
entry.props.halign = Gtk.Align.FILL
search_bar.add(entry)

window.show_all()
window.connect('destroy', Gtk.main_quit)
Gtk.main()

从关闭按钮的大小和位置可以看出,SearchBar 确实使用了 Window 中的所有 space。但是 SearchEntry 不会增长到超过其标准大小。为什么会这样,我该怎么办?

如果您正在寻找一个简单的解决方案,我必须提前为这个答案道歉。这很hacky,但它有效。首先,SearchBar 有一个相当复杂的子部件设置。它看起来像这样:

Gtk.SearchBar
|   Gtk.Revealer
|   |   Gtk.Box (we will call this "main_box")
|   |   |   Gtk.Box (we will call this "box1")
|   |   |   Gtk.Box (we will call this "box2")
|   |   |   |   Gtk.SearchEntry
|   |   |   Gtk.Box (we will call this "box3")
|   |   |   |   Gtk.Button
|   |   |   |   |    Gtk.Image

问题的根源在于此处的许多小部件。您的解决方案正在运行,用于入门;该条目正在尽可能地扩展。我将解释问题及其解决方案,然后在最后显示代码。这些数字使您可以看到哪些代码行与哪些解决方案步骤相关。

  1. 条目的父框 box2 没有尽可能地扩展。因此,您还需要为其设置 props.hexpandprops.halign。这部分有效,但在条目的左侧和右侧仍有一些额外的 space。

  2. 要解决这个问题,您需要从 main_box 中删除 box1,因为它不需要存在。现在,条目一直扩展到左侧,但条目右侧和按钮之间仍有一些 space。

  3. 是由于 box3 在不该扩展的时候扩展造成的。因此,您需要将 box3hexpand 设置为 False。这应该可以解决问题;您的搜索栏条目应该按照您希望的方式展开,并且按钮应该占据较少的水平空间 space

  4. (可选)如果你不想让按钮垂直展开,你可以把SearchBar放在一个VBox里,把那个VBox在 window。请注意,您需要在 VBox 上调用 pack_start() 才能正常工作:vbox.pack_start(search_bar, False, False, 0).

这里是相关代码(省略第4步)。您可以在 search_bar.add(entry):

行下方添加此代码
# Get the correct children into the right variables
main_box = search_bar.get_children()[0].get_children()[0]
box1, box2, box3 = main_box.get_children()

# Fix the problem
box2.props.hexpand = True # See step 1
box2.props.halign = Gtk.Align.FILL # See step 1
main_box.remove(box1) # See step 2
box3.props.hexpand = False # See step 3