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
Deuxième fenêtre - Niveau supérieur
Deuxième fenêtre - vide
Pourquoi cela se produit-il et comment le résoudre?
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)