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