我有一个 Python 应用程序,它使用一个Gtk.Notebook
小部件来显示不同的页面。每个页面都包含一组不同的小部件,我注意到,就垂直空间而言“最高”的小部件定义了笔记本的整体垂直尺寸。
但实际上我希望我的应用能够调整页面大小,以免浪费垂直空间,并进行调整,即调整为与它们所包含的小部件相同的垂直尺寸。当我选择每个页面时,应该会发生这种调整。
这是生成此笔记本的示例代码(为简单起见,该示例每个页面包含一个小部件)
简而言之,如何在选择笔记本页面时动态调整它们的大小,以便它们的垂直空间与其子窗口小部件相同?
答案1
我不知道一个好的答案,但我有一个解决方法:
基本思想是需要容器窗口小部件作为父窗口小部件每个页面(不要将标签直接放置在页面中),并且可以隐藏/显示除容器之外的所有内容(如果您也隐藏容器,页面将会消失)。
该解决方案应该适用于任意的小部件层次结构。
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()
在我最初的回答中,我记录并重新设置了请求的大小。这通常不起作用,因为请求的大小只是最小大小。不过,为了使这个方法有效,我必须记录最大大小。
答案2
如果实际的笔记本小部件不是必需的,而只是一种将相似内容放在一起并提供在它们之间切换的方法,那么可能会有更好/更简单的解决方案。下面是一个最终用于问答机:
主要思想是使用像游戏盒子(在下面的示例中调用page_box
)并只保留一个可见的项目。您还需要一个包含每个页面内容的列表,每个页面都打包到单个小部件中(例如网格)。
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()
这不是问题的字面答案,但它可能解决同样的问题。