Как динамически изменять размер страниц тетради GTK

У меня есть приложение на Python, которое использует виджет Gtk.Notebook для отображения разных страниц. Каждая из этих страниц содержит различный набор виджетов, и я заметил, что «самый высокий» виджет с точки зрения вертикального пространства определяет общий вертикальный размер ноутбука.

Но я бы на самом деле хотел, чтобы мое приложение изменяло размер страниц, чтобы не тратить вертикальное пространство, и адаптировалось, то есть меняло размеры до того же вертикального размера, что и виджет, который они содержат. Это изменение размера должно произойти, когда я выбираю каждую страницу.

Test app showing undesired vertical space

Вот пример кода для создания этой записной книжки (пример содержит виджет на страницу для простоты)

Так короче говоря, как я могу динамически изменять размеры страниц записной книжки после их выбора, чтобы их вертикальное пространство соответствовало их дочернему виджету?

5
задан 27 October 2018 в 16:35

2 ответа

Я не знаю хороший ответ, но у меня есть обходное решение для Вас:

Основная идея состоит в том, что Вам нужен контейнерный виджет как родительский виджет на каждой странице (не помещайте, например, маркировка непосредственно на странице), и можно скрыться/показать все кроме контейнера (При сокрытии контейнера также страница исчезнет).

Это решение должно работать так как иначе произвольные иерархии виджета.

from gi.repository import Gtk

class NotebookWindow():
    def __init__(self):
        self.builder = Gtk.Builder()
        self.builder.add_from_file('notebook.ui')
        self.builder.get_object('window1').connect('delete-event',
            Gtk.main_quit)
        notebook = self.builder.get_object('notebook1')
        notebook.connect("switch-page", self.on_notebook1_switch_page)
        self.on_notebook1_switch_page(notebook, None,
                                      notebook.get_current_page())

    def on_notebook1_switch_page(self, widget, label, page):
        for p in range(widget.get_n_pages()):
            container = widget.get_nth_page(p)
            if not p == page:
                for c in container.get_children():
                    try:
                        c.hide_all()
                    except AttributeError:
                        c.hide()
            else:
                for c in container.get_children():
                    try:
                        c.show_all()
                    except AttributeError:
                        c.show()


if __name__ == '__main__':
    notebookwindow = NotebookWindow()
    Gtk.main()

В моем исходном ответе я записал и восстановил требуемые размеры. Это не работает в целом, потому что требуемый размер является только минимальным размером. Я должен был бы записать максимальный размер для этого для работы, все же.

3
ответ дан 27 October 2018 в 16:35

ЕСЛИ фактический виджет блокнота не нужен, а является просто способом объединить похожий контент и обеспечить возможность переключения между ними, тогда могут быть лучшие / более простые решения. Вот тот, который в конце концов использовался для Qreator :

. Основная идея - использовать контейнер, подобный Gtk.Box (называемый page_box в пример ниже) и держите только один элемент видимым. Вам также нужен список с содержимым каждой страницы, каждая из которых упакована в один виджет (например, Gtk.Grid ).

for page in page_list:
    self.ui.page_box.add(page.grid)

Здесь page_list - простой список объектов страницы, где объект страницы имеет свойство grid (Gtk.Grid, содержащий все содержимое страницы).

Наконец, вам нужно предоставить способ переключения между контентом, например, с набором кнопок, каждый из которых вызывает метод переключателя с соответствующим page_id при нажатии:

def switch_view(self, page_id):
    # hide all pages
    for child in self.ui.page_box.get_children():
        child.hide()
    # show the single page that is active
    self.ui.page_box.get_children()[page_id].show()

Это не буквальный ответ на вопрос, но он может решить ту же проблему.

0
ответ дан 27 October 2018 в 16:35

Другие вопросы по тегам:

Похожие вопросы: