Упаковка коробок действительно проста, так что, возможно, вы не понимаете ее потому, что воображаете, что она сложнее, чем она есть на самом деле.
Макет либо вертикальный (как куча кирпичей), либо горизонтальный (как очередь людей). Каждый элемент в этом макете может расширяться или не расширяться.
Горизонтальный (HBox)
[widget][widget][widget][widget]
Вертикальный (VBox)
[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
делает не совсем то, что вы от него ожидаете. Он не меняет размер виджета, а только то, сколько места он будет запрашивать. Он может использовать больше и даже растягиваться, чтобы заполнить большие пространства. Он редко становится меньше, чем запрос, но опять же, поскольку это всего лишь «запрос», нет гарантии, что запрос будет выполнен.
person
Ali Afshar
schedule
21.03.2009