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

PyQt Python Discussion :

Comment ne pas exécuter deux fois la même application


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 320
    Par défaut Comment ne pas exécuter deux fois la même application
    Bonjour à tous,

    Afin de parfaire mon apprentissage de PySide6, je me suis fait une petite application genre "Lecteur vidéo".
    Je peux ouvrir une vidéo, la lire et en charger une autre etc....

    J'ai par la suite compilé le code avec Nuitka pour obtenir un fichier exécutable sous windows. Là encore, tout fonctionne bien. En exécutant le fichier, je peux faire la même chose qu'en "version" Python.

    Je peux aussi ouvrir une vidéo, avec le "Ouvrir Avec" de windows.

    Par contre, j'ai un problème : Si une vidéo est en train d'être lue, et que par ailleurs, je lance une autre vidéo avec un "Ouvrir Avec....", cela me crée une seconde instance de mon app.

    Comment puis-je faire pour que le lancement de ma seconde vidéo se déroule dans le même processus en lieu et place de la première.

    JE suis allé voir QCoreApplication.instance(), mais je ne sais si je fais fausse route.

    J'espère que vous aurez des informations qui pourraient m'aider.

    Bonne journée à tous.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    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 681
    Par défaut
    Salut,

    Citation Envoyé par FadeToBlack Voir le message
    Comment puis-je faire pour que le lancement de ma seconde vidéo se déroule dans le même processus en lieu et place de la première.
    Il faut détecter que l'application est déjà lancé et avoir une porte pour lui communiquer d'arrêter la vidéo en cours pour démarrer la nouvelle.
    C'est juste de la programmation.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 320
    Par défaut
    Bonjour wiztricks,

    Je pensais effectivement faire une chose de la sorte. Mais je n'arrive pas à la mettre en pratique et surtout comment.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    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 681
    Par défaut
    Citation Envoyé par FadeToBlack Voir le message
    Mais je n'arrive pas à la mettre en pratique et surtout comment.
    Certes mais est ce une question de programmation python?
    Cherchez du côté de QtSingleApplication, cela devrait vous donner des idées... la plus simple étant de démarrer la première application avec un serveur (socket), la deuxième qui essaiera de démarrer le service plantera (le port est utilisé).... et on a une socket pour dialoguer avec l'application déjà démarrée.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre éclairé Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 320
    Par défaut
    j'ai essayé un truc du genre :

    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
    import sys
     
    from PySide6.QtCore import QCoreApplication
    from PySide6.QtWidgets import QApplication
    from src.emp import Emp
     
    if __name__ == '__main__':
     
        if QCoreApplication.instance() is None:
            print("Pas d'instance est ouverte")
            app = QApplication(sys.argv)
            if len(sys.argv) < 2:
                # Création de ma fenêtre de lecture vidéo
                main = Emp()
            else:
                main = Emp(sys.argv[1])
            main.show()
        else:
            print("Une instance est ouverte")
            Emp.open_file_with_parameters(sys.argv[1])
        print(sys.argv)
        app.setStyle("Fusion")
        app.exec()
    Mais cela m'ouvre quand même un seconde fenêtre

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    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 681
    Par défaut
    Citation Envoyé par FadeToBlack Voir le message
    j'ai essayé un truc du genre :
    ...
    Mais cela m'ouvre quand même un seconde fenêtre
    A partir du moment où vous utilisez des interfaces documentées, vous êtes supposé avoir lu la documentation et plus ou moins compris que ça pourrait le faire.
    Si ça ne le fait pas, c'est que vous utilisez mal le truc ou que ca ne pourra pas résoudre le problème: à vous de relire la documentation et de dire pourquoi vous espérez que çà marche...

    Je vous ai suggéré une autre approche.
    A vous de voir...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 287
    Par défaut
    Si tu désires "juste" bloquer une nouvelle "même application", existe une solution simple avec QT (A voir si bon lorsque plantages)
    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
    #!/usr/bin/env python
    import sys
    from PySide6.QtCore import QSharedMemory
    from PySide6.QtWidgets import QApplication, QComboBox
     
    if __name__ == '__main__':
     
        sharedMemory = QSharedMemory('MaSignatureUniqueDeMonApp')
        if not sharedMemory.create( 64, QSharedMemory.ReadWrite):
            print("Déja ouvert !")  # ou ...
            exit(66)
        try:
            app = QApplication(sys.argv)
            main = QComboBox()
            main.show()
            app.exec()
        finally:
            sharedMemory.detach()
    Mais, ce que tu demandes est beaucoup plus compliqué. La réponse #4 est claire :
    - Transformer ton application en serveur
    - si "serveur" détecté (un "ping" au serveur), alors lui envoyer une commande (charge_fichier), sinon lancer le serveur

    sous win existe 36 moyens de faire communiquer la seconde instance indésirable avec "la première" (et autres sous linux...)
    Note ! la première solution du lien est surprenante (j'ai jamais testé) et certainement amusante à écrire genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if pressepapier.search("SignatureApp"):
       pressepapier.write(f"SignatureApp load {sys.argv[1]}")
       exit()
    #Lancer app
        pressepapier.write("SignatureApp")   # type mime spécifique a l'app
        ...
        chaque seconde :
           if fichier :=pressepapier.seach("SignatureApp load")
               app.load(fichier)
    finally:
          pressepapier.clearAll("SignatureApp*")

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 035
    Par défaut
    Citation Envoyé par papajoker
    ou c'est plutot cela que tu attends ?
    Pas sûr... Pourquoi pas la méthode write de QIODevice ?

    Ça prend des bytes en paramètre, pas grave, on utilise la méthode .encode("utf8")

Discussions similaires

  1. [Sonar] Ne pas executer deux fois les tests
    Par woodwai dans le forum Qualimétrie
    Réponses: 3
    Dernier message: 23/03/2010, 17h54
  2. [AC-2007] Ne pas imprimer deux fois la même chose
    Par Flup dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 24/11/2009, 20h47
  3. [Perl POO] ne pas créer deux fois le même objet
    Par seben dans le forum Langage
    Réponses: 4
    Dernier message: 30/03/2009, 21h19
  4. Réponses: 7
    Dernier message: 30/10/2008, 11h31
  5. Comment ne pas enregistrer plusieurs fois une touche ?
    Par Jordinateur dans le forum SDL
    Réponses: 33
    Dernier message: 05/10/2007, 21h44

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