Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Горизонтальный (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 не делает именно то, что вы от него ожидаете.Он не меняет размер виджета, а лишь количество места, которое он запрашивает.Он может использовать больше и даже растягиваться, чтобы заполнить большее пространство.Он редко становится меньше запроса, но опять же, поскольку это всего лишь «запрос», нет никакой гарантии, что запрос будет выполнен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top