web-dev-qa-db-fra.com

Comment redimensionner dynamiquement les pages du cahier GTK

J'ai une application Python qui utilise un widget Gtk.Notebook pour afficher différentes pages. Chacune de ces pages contient un ensemble différent de widgets et j'ai remarqué que le widget le plus haut en termes d'espace vertical définit la taille verticale globale du bloc-notes.

Mais j'aimerais en fait que mon application redimensionne les pages pour ne pas gaspiller d'espace vertical et s'adapte, c'est-à-dire qu'elle soit redimensionnée à la même taille verticale que le widget qu'elle contient. Ce redimensionnement devrait se produire lorsque je sélectionne chaque page.

Test app showing undesired vertical space

Voici le exemple de code permettant de générer ce bloc-notes (l'exemple contient un widget par page pour des raisons de simplicité)

En bref, comment puis-je redimensionner de manière dynamique les pages d'un cahier lors de sa sélection, de sorte que son espace vertical soit adapté pour être identique à son widget enfant?

5
David Planella

Je ne connais pas de bonne réponse, mais j'ai une solution pour vous:

L'idée de base est que vous nécessité un widget conteneur en tant que widget parent dans each page (ne placez pas, par exemple, une étiquette directement dans la page), et vous pouvez masquer/afficher tout sauf le conteneur (si vous masquez également le conteneur, la page disparaîtra).

Cette solution devrait fonctionner pour des hiérarchies de widgets par ailleurs arbitraires.

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()

Dans ma réponse originale, j'ai enregistré et rétabli les tailles demandées. Cela ne fonctionne pas en général, car la taille demandée est seulement une taille minimale. Je devrais enregistrer une taille maximale, pour que cela fonctionne, cependant.

3
xubuntix

SI, le widget de bloc-notes n’est pas nécessaire, mais constitue simplement un moyen de conserver un contenu similaire ensemble et de fournir un moyen de basculer entre eux. pourrait être des solutions meilleures/plus simples. En voici un qui a finalement été utilisé pour Qreator :

l'idée principale est d'utiliser un conteneur comme un Gtk.Box (appelé page_box dans l'exemple ci-dessous) et de ne garder qu'un seul élément visible. Vous avez également besoin d'une liste avec le contenu de chaque page, chacune regroupée dans un seul widget (par exemple, un Gtk.Grid ).

for page in page_list:
    self.ui.page_box.add(page.grid)

Ici, page_list est une simple liste d'objets de page, l'objet de page ayant une propriété grid (le Gtk.Grid contenant tout le contenu de la page).

Enfin, vous devez fournir un moyen de basculer entre les contenus, par exemple avec un ensemble de boutons, chacun appelant une méthode de commutation avec le page_id correspondant quand on clique dessus:

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()

Ce n'est pas une réponse littérale à la question, mais cela pourrait résoudre le même problème.

1
xubuntix