У меня есть приложение на Python, которое использует виджет Gtk.Notebook
для отображения разных страниц. Каждая из этих страниц содержит различный набор виджетов, и я заметил, что «самый высокий» виджет с точки зрения вертикального пространства определяет общий вертикальный размер ноутбука.
Но я бы на самом деле хотел, чтобы мое приложение изменяло размер страниц, чтобы не тратить вертикальное пространство, и адаптировалось, то есть меняло размеры до того же вертикального размера, что и виджет, который они содержат. Это изменение размера должно произойти, когда я выбираю каждую страницу.
Вот пример кода для создания этой записной книжки (пример содержит виджет на страницу для простоты)
Так короче говоря, как я могу динамически изменять размеры страниц записной книжки после их выбора, чтобы их вертикальное пространство соответствовало их дочернему виджету?
Я не знаю хороший ответ, но у меня есть обходное решение для Вас:
Основная идея состоит в том, что Вам нужен контейнерный виджет как родительский виджет на каждой странице (не помещайте, например, маркировка непосредственно на странице), и можно скрыться/показать все кроме контейнера (При сокрытии контейнера также страница исчезнет).
Это решение должно работать так как иначе произвольные иерархии виджета.
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()
В моем исходном ответе я записал и восстановил требуемые размеры. Это не работает в целом, потому что требуемый размер является только минимальным размером. Я должен был бы записать максимальный размер для этого для работы, все же.
ЕСЛИ фактический виджет блокнота не нужен, а является просто способом объединить похожий контент и обеспечить возможность переключения между ними, тогда могут быть лучшие / более простые решения. Вот тот, который в конце концов использовался для 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()
Это не буквальный ответ на вопрос, но он может решить ту же проблему.