web-dev-qa-db-ja.com

GTKノートブックページを動的にサイズ変更する方法

別のページを表示するためにGtk.Notebookウィジェットを使用するPythonアプリがあります。これらの各ページには異なるウィジェットのセットが含まれており、垂直方向のスペースに関する「最も高い」ウィジェットがノートブックの全体的な垂直方向のサイズを定義していることに気付きました。

しかし、実際には、アプリが垂直方向のスペースを無駄にしないようにページのサイズを変更し、適応する、つまり、含まれるウィジェットと同じ垂直方向のサイズにサイズを変更することを望んでいます。このサイズ変更は、各ページを選択したときに発生するはずです。

Test app showing undesired vertical space

このノートブックを生成するためのサンプルコード です(簡単にするために、この例にはページごとにウィジェットが含まれています)

つまり、ノートブックのページを選択するときに、その垂直方向のスペースが子ウィジェットと同じになるように動的にサイズを変更するにはどうすればよいでしょうか?

5
David Planella

いい答えはわかりませんが、次善策があります。

基本的な考え方は、needeachページの親ウィジェットとしてのコンテナウィジェット(たとえば、ラベルをページに直接配置しないでください)で、非表示/表示ができるということです。コンテナを除くすべて(コンテナも非表示にすると、ページは消えます)。

このソリューションは、それ以外の任意のウィジェット階層で機能するはずです。

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 __== '__main__':
    notebookwindow = NotebookWindow()
    Gtk.main()

最初の回答では、要求されたサイズを記録して復元しました。要求されたサイズは最小サイズに過ぎないため、これは一般に機能しません。ただし、これを機能させるには、最大サイズを記録する必要があります。

3
xubuntix

IF実際のノートブックウィジェットは必要ありませんが、同様のコンテンツを一緒に保持し、それらを切り替える方法を提供する方法にすぎませんより良い/簡単なソリューションかもしれません。最後に Qreator に使用されたものを次に示します。

主なアイデアは、 Gtk.Box (以下の例ではpage_boxと呼ばれる)のようなコンテナを使用し、1つのアイテムのみを表示することです。また、各ページのコンテンツを含むリストが必要です。各ページは、1つのウィジェットにパックされています(例: 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()

これは質問に対する文字通りの答えではありませんが、同じ問題を解決する可能性があります。

1
xubuntix