web-dev-qa-db-fra.com

la fenêtre gtk3 n'est pas redessinée correctement

Je crée une application GTK3 simple. La fenêtre principale de niveau supérieur a un bouton recherche qui affichera une autre fenêtre de niveau supérieur gtk3. Lorsque je clique sur le bouton de fermeture (près de la barre de titre) dans la deuxième fenêtre gtk3, il se ferme comme prévu. Cependant, lorsque je clique à nouveau sur le bouton de recherche, la deuxième fenêtre de niveau supérieur n'est pas redessinée avec tous ses widgets ... au lieu de cela, elle apparaît vide.

Si par contre, je clique sur le bouton de fermeture (bouton gtk vu en bas) il se ferme correctement. Et une fois rouvert, tous les widgets peuvent être vus.

Info : J'ai créé l'interface utilisateur en utilisant Glade.

Le code est affiché ci-dessous. Cependant, pour obtenir les fichiers d'interface utilisateur, vous devez télécharger le package. Vous pouvez les télécharger ici

#! /usr/bin/env python

from gi.repository import Gtk
import os,sys

UI_FILE = "main.ui"
SECOND_UI_FILE = "second.ui"

class SampleApp:
    def __init__(self):
        self.builder = Gtk.Builder()
        self.builder.add_from_file(UI_FILE)
        self.builder.connect_signals(self)

        self.builder2 = Gtk.Builder()
        self.builder2.add_from_file(SECOND_UI_FILE)
        self.builder2.connect_signals(self)

        self.window = self.builder.get_object('window')
        self.window.set_position(Gtk.WindowPosition.CENTER)
        self.window.connect("destroy", self.destroy)
        self.window.show_all()

        self.search = self.builder.get_object('button1')
        self.search.connect("clicked", self.search_clicked)

    def destroy(self, window):
        Gtk.main_quit()

    def search_clicked(self, window):
        self.secondwindow = self.builder2.get_object('window1')
        self.secondwindow.show_all()

def main():
    app = SampleApp()
    Gtk.main()

if __== "__main__":
    main()

Fenêtre principale  enter image description here

Deuxième fenêtre - Niveau supérieur  enter image description here

Deuxième fenêtre - vide  enter image description here

Pourquoi cela se produit-il et comment le résoudre?

2
nik90

Ok, ce que fait votre code, il laisse la deuxième fenêtre se détruire. Après ça, c'est parti.

Vous pouvez soit empêcher la fenêtre d'être détruite (et la cacher à la place) en ajoutant ces deux lignes à la fin de votre méthode init:

secondwindow = self.builder2.get_object('window1')
secondwindow.connect('delete-event', lambda w, e: w.hide() or True)

qui remplace l'événement delete ( documentation ici ).

Ou vous pouvez recréer la fenêtre chaque fois que vous l'ouvrez, en plaçant ces lignes au début de votre search_clicked méthode:

self.builder2 = Gtk.Builder()
self.builder2.add_from_file(SECOND_UI_FILE)
self.builder2.connect_signals(self)
3
xubuntix