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

Python Discussion :

Executer un fonction dans une autre instance de la même application


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 36
    Points : 24
    Points
    24
    Par défaut Executer un fonction dans une autre instance de la même application
    Bonjour,

    Je ne pense pas que mon sujet soit très explicite alors voici mon problème :
    J'ai fait une application (avec wxpython) et en ai fait un .exe Windows avec py2exe.
    Jeux peux la lancer en lui passant comme argument le nom d'un fichier, qu'elle ouvre alors. (en double cliquant sur un fichier had hoc depuis l'explorateur par exemple).
    Il s'agit d'une application multi-documents : on peut ouvrir plusieurs documents, qui s'ouvrent dans différents onglets.

    J'aimerais que lorsqu'on double-clique sur un de ces documents depuis l'explorateur Windows, alors que l'application est déjà lancée, il ne s'en lance pas une autre, mais que le document s'ouvre dans celle qui est déjà ouverte.

    J'ai trouvé plusieurs moyens de détecter si l'application est déjà lancée, mais pas de la "contrôler".

    Si quelqu'un a une solution pour ça, je l'en remercie d'avance.

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Il me semble avoir déjà vu la question sur le forum mais je ne suis pas assez pointu sous win32 pour vous donner une réponse avec.
    Par contre vous pouvez utiliser socket et un thread:
    Dans la FAQ vous avez un exemple pour tester le lancement d'une application avec socket.
    Il vous suffit de lancer le serveur dans un thread et de tester sa présence lors du lancement.
    Si le serveur est présent on lui envoi le fichier a ouvrir et on quitte. Dans le cas contraire on lance le thread serveur.
    C'est du 'bricolage' par rapport à ce qui se fait mais c'est multi plateforme.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    "Comment faire en sorte qu'un document soit ouvert dans l'application MDI déjà lancée" est plus une question côté Windows et/ou WxWindows.
    note: je ne suis pas certain que vous trouverez de réponse ici.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà un problème intéressant!

    Je n'ai pas le temps aujourd'hui de le tester, mais voilà les pistes que j'utiliserais:

    - pour qu'un programme se lance quand on double-clique sur un fichier dans l'explorateur, il faut que le fichier ait une extension particulière et que Windows soit renseigné de la liaison fichier_avec_extension=>programme_à_exécuter. Je sais le faire à la main, mais pour le faire automatiquement, il faut probablement avoir recours au module win32.

    - pour empêcher un programme d'être lancé 2 fois, je préfère la solution ici: http://python.jpvweb.com/mesrecettes...er_double_exec qui a l'avantage par rapport aux solutions de la FAQ de résister à un plantage puisqu'à l'arrêt d'exécution du programme, même anormal, le verrou disparait. Cette solution vient d'une discussion avec wiztricks (merci!): http://www.developpez.net/forums/d10...4/#post5785513.

    - Il faudrait donc 2 fichiers utilitaires dont le nom serait spécifique à ce programme:
    => monprogramme_lock.txt: fichier sur lequel sera placé le verrou
    => monprogramme_fic.txt: fichier texte qui donnera le nom du fichier à afficher

    A quel endroit doit-on mettre ces 2 fichiers? Avec les OS modernes, on ne doit pas faire écrire un programme à l'endroit où il a été installé, mais on peut toujours écrire dans le home de l'utilisateur qui a lancé le programme! On peut trouver le répertoire du home de l'utilisateur avec: os.path.expanduser('~'). Et c'est multiplateforme: avec Windows 7, je trouve chez moi: C:\Users\tyrtamos.

    - Avec tout cela, voilà la logique de lancement du programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    si monprogramme_lock.txt n'existe pas:
        le créer
     
    si monprogramme_lock.txt n'est pas verrouillé:
        # on est ici dans une 1ère exécution du programme
        le verrouiller
        effacer un éventuel fichier monprogramme_fic.txt
        lancer le thread de surveillance option daemon (voir la suite)
    sinon
        # on est ici dans une tentative de 2e exécution du programme
        si on a un fichier à afficher:
            créer monprogramme_fic.txt et écrire dedans le nom du fichier à afficher 
        sortir du programme (une 2e exécution est interdite)
    Il ne reste plus qu'à créer dans le programme le thread de surveillance qui:
    => vérifiera, par exemple toutes les 5 secondes, la présence du fichier monprogramme_fic.txt,
    => et si oui lira le fichier contenu, effacera le fichier monprogramme_fic.txt et enverra un message au programme pour que le fichier soit affiché dans une fenêtre supplémentaire du MDI.

    Petit rappel, je ne connais pas wxpython, mais je sais qu'en général, les threads ne doivent pas contenir d'instruction graphique: il faut donc que le thread envoie un message au programme principal pour que celui-ci lance l'affichage du fichier supplémentaire!

    Ouf...

    Bon courage!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Je ne sais pas si c’est utilisable en wxpython, mais wxWidget fournit une classe, wxSingleInstanceChecker, qui permet de vérifier l’existence d’une instance déjà lancée (pour windows et unix)…

    Évidemment, il faut encore implémenter l’ouverture du fichier dans cette instance pré-éxistante –*j’aime bien la solution de tyrtamos, pour sa simplicité.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    Bonjour

    Et merci à tous pour vos réponses !

    Mon cœur balance entre la solution de tyrtamos (simple et à ma portée) et celle évoquée par PauseWawa à laquelle je ne pipe pratiquement pas un mot (je n'ai jamais reçu de cours d'informatique et je ne comprends pas à quoi pourrait bien me servir une "socket"), mais que j'ai quand même choisie dans un premier temps, pour la même raison.

    Mais comme ne rien entendre à un concept n'empêche pas de s'y frotter, j'ai fait ça :
    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
    class Server( dispatcher ):
        def __init__(self, nomfichier):
            dispatcher.__init__(self)
            self.create_socket( socket.AF_INET, socket.SOCK_STREAM )
            self.buffer = ""
            self.fichier = nomfichier
            try:
                self.bind( ( '', 50000 ) )
            except:
                self.connect(( '', 50000 ))
                self.send(nomfichier)
                sys.exit()
            self.listen(1)
     
        def handle_write(self):
            sent = self.send(self.buffer)
            self.buffer = self.buffer[sent:]
     
        def writable(self):
            return (len(self.buffer) > 0)
     
        def handle_read(self):
            s = self.recv(len(self.buffer))
            print "Recv", s
     
        def handle_close(self):
            print 'close'
            self.close()
     
        def handle_accept(self):
            return True
    C'était prévisible : ça ne marche pas ! Le serveur de la première instance de mon programme ne reçoit rien de celui de la deuxième...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    Finalement, j'ai opté pour la méthode décrite ici :
    http://stackoverflow.com/questions/5...ssing-commands

    Avec un conseil supplémentaire : passer la commande à l'application déjà lancée travers un event (je n'y suis pas arrivé autrement).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Executer une fonction dans une autre base de donnees
    Par yonnel dans le forum VBA Access
    Réponses: 5
    Dernier message: 27/10/2007, 01h31
  2. appel d'une fonction dans une autre feuille
    Par mardona dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 10/04/2007, 17h51
  3. Réponses: 3
    Dernier message: 30/11/2006, 06h25
  4. PHP4 appel d'une fonction dans une autre
    Par cmicdev dans le forum Langage
    Réponses: 6
    Dernier message: 18/05/2006, 11h37
  5. Probleme d'apel de fonction dans une autre classe
    Par freecell31 dans le forum MFC
    Réponses: 24
    Dernier message: 13/05/2006, 11h34

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