IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec Python Discussion :

Relancer une application pygtk


Sujet :

GTK+ avec Python

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Inscrit en
    Mai 2006
    Messages
    96
    D�tails du profil
    Informations personnelles :
    �ge : 38

    Informations forums :
    Inscription : Mai 2006
    Messages : 96
    Par d�faut Relancer une application pygtk
    Bonjour,

    Je cherche comment relancer une appli en pygtk a partir de cette m�me appli, dans le but de recharger la langue selectionn�e.

    J'ai essay� en utilisant os.system("python monappli.py"), ca fonctionne mais l'ancienne appli ne se ferme pas et reste derri�re, inactive.
    J'ai pourtant fait attention a ce que cet appel soit fait apr�s le gtk.main_quit(), et que gtk.main() soit relanc�, je ne comprend pas.

    en gros ce que je fait :

    main.py:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    MonAppli()
    gtk.main()
    if #teste si un fichier existe# :
        #destruction du fichier
        MonAppli()
        gtk.main()
    MonAppli:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    class MonAppli:
        #bla bla bla
        def relancer(self):
            #ecriture du fichier sur le disque
            gtk.main_quit()
    Une autre solution serait de lancer, dans MonAppli, une commande bash qui relancerait le main.py apr�s x temp et de fermer gtk, mais je ne sais pas comment on fait ca en bash

    merci de votre aide.

  2. #2
    Membre chevronn�
    Inscrit en
    Janvier 2007
    Messages
    329
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par d�faut
    Salut,

    Je pense que le plus simple serait de faire �a depuis bash, en utilisant les codes retour.
    Un programme qui se termine normalement renvoie un code retour 0. Tu peux faire en sorte que ton prog python renvoie une autre valeur (g�n�ralement on utilise des puissances de 2) quand la langue doit �tre chang�e.

    Exemple :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    #!/bin/bash
    declare -i retour=128
    while (( retour == 128 )) ; do
        python tonprog.py
        retour=$?
    done
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    # tonprog.py
    import sys
    if change_langue == True:
        sys.exit(128)
    else:
        sys.exit(0)
    J'ai pas test�, mais �a devrait marcher...

  3. #3
    Membre confirm�
    Inscrit en
    Mai 2006
    Messages
    96
    D�tails du profil
    Informations personnelles :
    �ge : 38

    Informations forums :
    Inscription : Mai 2006
    Messages : 96
    Par d�faut
    Merci beaucoup !

    Par contre ca ne peut marcher que si j'appelle le fichier bash, si j'appelle directement dans une console le main.py ca ne peut plus marcher, j'aimerais bien faire ca uniquement en python, menfin c'est d�j� une bonne solution.

    Petite pr�cision, le sys.exit() je le met apr�s le gtk.main_quit(), on est d'accord?

  4. #4
    Membre chevronn�
    Inscrit en
    Janvier 2007
    Messages
    329
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par d�faut
    Oui, le sys.exit() termine ton programme. Tout ce qui est apr�s ne sera pas ex�cut�.

    Y'a surement moyen de faire �a tout en python, mais je ne connais pas suffisamment les m�canismes qui entrent en jeu en lan�ant Gtk. Normalement, le ramasse-miettes d�truit les objets qui ne sont plus utilis�s, mais il peut rester des trucs qui font que ta classe reste instanci�e...


    J'ai fait un truc qui semble marcher :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    #!/usr/bin/python
    # -*- coding:utf-8 -*-
     
    import pygtk
    pygtk.require('2.0')
    import gtk
    import time
     
     
    class MonAppli(gtk.Window):
     
        def __init__(self, message):
            gtk.Window.__init__(self)
            self.set_default_size(400, 300)
            self.add(gtk.Label(message))
            self.connect('delete_event', self.ev_delete)
            self.connect('destroy', self.ev_destroy)
            self.set_title("Mon appli")
            self.show_all()
     
        def ev_delete(self, widget=None, event=None, data=None):
            return False
     
        def ev_destroy(self, widget=None, data=None):
            gtk.main_quit()
     
        def main(self):
            gtk.main()
            return 0
     
     
    if __name__ == "__main__":
        print "START"
        MonAppli("Salut !").main()
        time.sleep(2)
        MonAppli("Ca va bien ?").main()
        print "STOP"

  5. #5
    Membre confirm�
    Inscrit en
    Mai 2006
    Messages
    96
    D�tails du profil
    Informations personnelles :
    �ge : 38

    Informations forums :
    Inscription : Mai 2006
    Messages : 96
    Par d�faut
    J'ai essay� de m'inspirer de ton exemple, mais je n'arrive a rien, la deuxi�me fen�tre s'ouvre, dans la bonne langue, mais la premi�re reste ouverte et active.

    je detaille un peu plus :

    main.py:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    f=open(G.FICHIER_ETAT,"w")
    f.close()
    if __name__ == '__main__':
        while os.path.isfile(G.FICHIER_ETAT):
            os.system("rm %s"%G.FICHIER_ETAT)
            app = Vue()
            app.main()
    vue.py:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Vue:
        def main(self):
            gtk.main()
            return 0
        #blablabla
        def delete(self, source=None, event=None,redemarrer=False):
            if redemarrer:
                print "redemarrage"
                f=open(G.FICHIER_ETAT,"w")
                f.close()
            gtk.main_quit()
    le signal "delete-event" est connect� a delete(), et lorsque je change de langue dans le programme une boite de confirmation s'ouvre et si l'utilisateur valide delete(redemarrer=true) est appel�.

    Tu vois ce qui cloche ?

    Autre pr�cision : a quoi sert le "return 0" dans le main() ?

    Merci beaucoup !

  6. #6
    Membre chevronn�
    Inscrit en
    Janvier 2007
    Messages
    329
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par d�faut
    Je crois savoir ce qui bloque : il manque un m�chant "destroy" quelque part pour se d�barrasser de l'ancienne fen�tre

    Par exemple, dans mon code, quand on demande de fermer l'application (clic sur la croix de la fen�tre dans mon cas), �a g�n�re un 'delete-event'. Quand le callback d'un 'delete-event' renvoie "False" (comme chez moi), un �v�nement 'destroy' est automatiquement lanc�, et il se charge de zigouiller proprement mon appli (et de faire le main_quit() dans mon cas).

    Normalement, on met les trucs du genre "�tes-vous s�r de vouloir quitter ?" (entre autres) dans le callback du 'delete-event', qui est appel� directement par le programme. Suivant s'il renvoie True ou False, �a quitte ou non l'application.


    Le "return 0", je sais pas, j'avais vu �a sur un tuto quand j'ai commenc� � faire du pygtk, et j'ai fait du copier-coller...

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. relancer une application apr�s une erreur critique
    Par d'Oursse dans le forum Windows
    R�ponses: 9
    Dernier message: 10/01/2012, 15h17
  2. R�ponses: 1
    Dernier message: 16/10/2008, 11h00
  3. relancer une application d�ja ouverte
    Par fally dans le forum C#
    R�ponses: 10
    Dernier message: 12/03/2008, 19h49
  4. [D7] Une application qui se relance
    Par Moine dans le forum D�buter
    R�ponses: 6
    Dernier message: 20/11/2007, 16h40
  5. Relancement d'une application
    Par cris73 dans le forum Prolog
    R�ponses: 1
    Dernier message: 28/03/2007, 15h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo