Кто-нибудь может объяснить упаковку Gtk2?

Мне нужно использовать Gtk2 для проекта. Я буду использовать для этого python/ruby. Проблема в том, что упаковка кажется мне чем-то мистическим. Я попытался использовать VBox, чтобы в моем окне были следующие виджеты (в следующем порядке):

  • строка меню
  • панель инструментов
  • текстовый просмотр / управление редактором

Мне удалось «угадать» свой путь с помощью pack_start и получить нужный мне макет, но я хотел бы иметь возможность понять его. Документация на Ruby Gtk2 кажется слишком неинтуитивной (как и документация по python, поскольку она такая же , написано только для Python), не могли бы вы пролить свет?

Кроме того, set_size_request не всегда работает, когда я добавляю компонент с pack_start. Почему это ?


person Geo    schedule 20.03.2009    source источник
comment
Всем, у кого есть проблемы с пониманием вещей в документации GTK+ для конкретного языка, я настоятельно рекомендую использовать основные документы C, которые полностью объясняют каждую функцию по адресу developer.gnome.org.   -  person oldtechaa    schedule 11.10.2016


Ответы (1)


Упаковка коробок действительно проста, так что, возможно, вы не понимаете ее потому, что воображаете, что она сложнее, чем она есть на самом деле.

Макет либо вертикальный (как куча кирпичей), либо горизонтальный (как очередь людей). Каждый элемент в этом макете может расширяться или не расширяться.

Горизонтальный (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