如何动态调整 GTK 笔记本页面的大小

如何动态调整 GTK 笔记本页面的大小

我有一个 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()

这不是问题的字面答案,但它可能解决同样的问题。

相关内容