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

时间:2014-04-18 10:04:39

标签: python gtk3 pygobject gio

我对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同样会展开。这很好。第一个按钮同样也会扩展。也好。但是,即使我使用set_allocation方法为GtkWidget,第二个按钮也不会是正方形。

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

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

enter image description here

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

1 个答案:

答案 0 :(得分:3)

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

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