如何更改 GTK 容器小部件的大小?

Posted

技术标签:

【中文标题】如何更改 GTK 容器小部件的大小?【英文标题】:How do I change the size of a GTK container widget? 【发布时间】:2014-06-02 19:52:36 【问题描述】:

我对 Gtk 如何控制 GtkBox 等容器内的小部件大小感到非常困惑。请问有人可以指导我解决这个问题的复杂性吗?

我有一个包含两个小部件的 GtkBox - 在示例中它们只是两个 GtkButtons。

第一个小部件应该刚好填满 GtkBox 容器内的可用空间。

我想强制的第二个小部件始终是一个物理正方形 - 因此随着正方形的扩大,第一个小部件的宽度会缩小。

一些示例代码在这里会有所帮助:

from gi.repository import Gtk

def on_check_resize(window):
    boxallocation = mainbox.get_allocation()

    width = 0
    height = 0

    if boxallocation.height >= boxallocation.width:
        width = boxallocation.height
        height = width

    if boxallocation.width >= boxallocation.height:
        width = boxallocation.width
        height = width

    secondbtn_allocation = secondbtn.get_allocation()
    secondbtn_allocation.width = width
    secondbtn_allocation.height = height
    secondbtn.set_allocation(secondbtn_allocation)

win = Gtk.Window(title="Containers Demo")
win.set_border_width(10)
win.connect("delete-event", Gtk.main_quit)

mainbox = Gtk.Box()

firstbtn = Gtk.Button(label="just fills the space")
mainbox.pack_start(firstbtn, True, True, 0)
secondbtn = Gtk.Button(label="square")
mainbox.pack_start(secondbtn, False, True, 1)

win.add(mainbox)

win.connect("check_resize", on_check_resize)

win.show_all()

initial = firstbtn.get_allocation()
initial.height = initial.width
firstbtn.set_size_request(initial.width, initial.height)

Gtk.main()

当你展开窗口时——GtkBox 也会展开。那挺好的。第一个按钮也同样展开。也好。然而,即使我对 GtkWidget 使用set_allocation 方法,第二个按钮也永远不会是方形的。

我不能使用 set_size_request(或者我可以吗?),因为当我缩小窗口时,由于第二个按钮的最小尺寸已更改,窗口无法调整大小。

我试图弄清楚容器如何管理间距的原因是我希望最终实现类似以下 iTunes 示例的东西:

即您可以看到封面始终是方形的 - 但音乐细节会根据可用空间缩小或扩大。

【问题讨论】:

【参考方案1】:

使用Gtk.Grid 代替Gtk.Box,并在您打包到网格中的按钮上设置hexpandvexpand 属性。

另外,请考虑为方形按钮使用Gtk.AspectFrame

【讨论】:

以上是关于如何更改 GTK 容器小部件的大小?的主要内容,如果未能解决你的问题,请参考以下文章

GTKmm - 无法将固定大小设置为 Gtk::Scale 小部件

如何更改按钮单击 GTK c 上的多个小部件属性

父级大小更改时如何更改子窗口小部件的大小?

如何在不知道小部件的字体系列/大小的情况下更改小部件的字体样式?

如何在 GTK 中更新(绘制)一个小部件和仅这个小部件

如何更改小部件菜单容器