web-dev-qa-db-fra.com

Python applet indicateur d'unité et fenêtre enfant glade se ferme en même temps

Puisque je n'ai pas beaucoup de réputation. La question d'origine a été publiée dans stackoverflow et voici le lien:
applet d'indicateur d'unité Python et fenêtre enfant de clairière

J'ai créé une applet d'indicateur d'unité avec python et glade. Voici la capture d'écran qui apparaît lorsque vous cliquez sur l'applet d'indicateur. Vous pouvez voir le menu des préférences. Lorsque ce menu des préférences est cliqué, il ouvre un nouvelle fenetre.

Indicator Applet Menu
Indicator Applet Menu

Preference Window
Preference Window

Maintenant, le problème est que lorsque je clique sur le bouton Fermer, toute l'application existe.

Le code qui déclenche la fenêtre de préférence est le suivant:

def action_preferences(self, widget):
    '''
    Show the preferences window
    '''
    base = PreferenceWindow()
    base.main()

    self.menu_setup()

preference.py a le code suivant:

 import sys 
 import json 
 import pynotify 
 
 essayez: 
 import pygtk 
 pygtk.require (" 2.0 ") 
 Sauf: 
 Réussite 
 Essayez: 
 Import gtk 
 Import gtk.glade 
 Sauf: 
 print ("GTK n'est pas disponible") 
 sys.exit (1) 
 
 class PreferenceWindow: 
 ui = None 
 configs = { } 
 notify = None 
 window = None 
 
 def __init __ (self): 
 
 sinon pynotify.init (" nepal-loadshedding "): 
 sys.exit (1) 
 
 self.ui = gtk.glade.XML (" pref_ui.glade ") 
 
 # Obtenez la préférence enregistrée précédemment 
 Self.configs = self.parse_configs () 
 
 Saved_group_value = str (self.configs.get ("GROUP")) 
 
 self.ui.get_widget ("text_group_number"). set_text (saved_group_value) 
 
 dic = {
 "on_btn_pref_ok_clicked": se lf.on_save_preference, 
 "on_btn_pref_close_clicked": self.on_close, 
 "on_preference_window_destroy": self.on_quit, 
} 
 
 self.ui. signal_autoconnect (dic) 
 
 si self.window est None: 
 self.window = self.main () 
 
 def parse_configs (self) : 
 self.configs = json.load (open ("config.txt")) 
 return self.configs 
 
 def save_configs (self, key, value ): 
 self.configs [clé] = int (valeur) 
 json.dump (self.configs, open ("config.txt", "wb")) 
 return True 
 
 Def on_save_preference (self, widget): 
 Group_number = self.ui.get_widget ("text_group_number"). Get_text () 
 Self.save_configs (" GROUP ", group_number) 
 
 # Essayez le cas de l'icône-résumé 
 Si self.notify == Aucun: 
 Self.notify = pynotify.Notificati on ("Nepal Loadshedding", "Groupe enregistré avec succès dans:" + group_number) 
 sinon: 
 self.notify.update ("Nepal Loadshedding", "Groupe enregistré avec succès dans:" + group_number) 
 self.notify.set_timeout (100) 
 
 self.notify.show () 
 imprimer "Enregistré avec succès" 
 
 def on_close (self, widget): 
 print 'close event called' 
 
 def on_quit (self, widget): 
 sys.exit (0) 
 
 def main (self): 
 gtk.main () 
2
Samundra
 "on_preference_window_destroy": self.on_quit, 

Cette ligne est votre problème. Lorsque la fenêtre est détruite, vous appelez une méthode quit. Lorsque vous fermez la fenêtre, elle est détruite, ce qui entraîne l'appel de votre méthode quit.

De plus, vous ne voulez pas appeler sys.exit(0) pour quitter une application GTK +. Vous souhaitez utiliser Gtk.main_quit() à la place. Ce serait également une bonne idée de convertir votre application en utilisant le gobject-introspection liaisons pour GTK + et les bibliothèques associées, plutôt que d'utiliser les anciennes et obsolètes liaisons pygtk.

3
dobey