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 :

Passage de variables entre 2 fenêtres Qt (PyQt5)


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 21
    Par défaut Passage de variables entre 2 fenêtres Qt (PyQt5)
    Bonjour à tous,

    Je pensais avoir compris comment échanger des variables entre 2 classes mais j'ai l'impression que non, surtout lorsque j'utilise des fenêtres Qt. Voici ce que je souhaiterai faire.

    J'ai une fenêtre principale (F1) avec, pour simplifier, deux boutons. L'un me permettant d'aller chercher le nom d'un fichier (actionLoadExperiment dans mon code qui va suivre) et l'autre qui va ouvrir une seconde fenêtre (F2). Je voudrais donc récupérer une variable str que je définis dans la class associé à F1 et la transmettre à la class associé à F2 pour après m'en servir dans des fonctions (j'espère être clair). Voici le code que j'utilise et qui ne fonctionne pas comme je voudrais:

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import sys
     
    from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog, QDialog
    from PyQt5 import uic, QtCore
     
    class MainWindowOPO(QMainWindow):
     
        def __init__(self, parent = None):
     
            ### Portion du code qui permet de convertir l'interface .ui de QtDesigner en .py  
            super(MainWindowOPO, self).__init__() # Call the inherited classes __init__ method
            uic.loadUi('MainWindowOPO.ui', self) # Load the .ui file
     
            ################################################################################ 
            ### Action lie a la barre des menus
            self.actionLoad.triggered.connect(self.actionLoadExperiment)
     
            self.pushButtonPivotal.clicked.connect(self.onPushButtonPivotal)
     
     
        def onPushButtonPivotal(self):   ### Procedure pour pivoter une courbe entre deux points (regression lineaire pour avoir les deux points a zero)
            self.pivotalWindow = PopUpPivotal()
            self.pivotalWindow.setWindowModality(QtCore.Qt.ApplicationModal)
            self.pivotalWindow.show()                      
     
     
        def actionLoadExperiment(self):
            dialog = QFileDialog()
            experiment_filename = dialog.getOpenFileName()
            self.loaded_filename = experiment_filename[0]
            return self.loaded_filename
     
     
    ###################################################################################################
    class PopUpPivotal(QDialog):
     
        def __init__(self, parent = None):
                super(PopUpPivotal, self).__init__() # Call the inherited classes __init__ method
                uic.loadUi('PopUpPivotal.ui', self) # Load the .ui file      
     
                self.pushButtonPivotal.clicked.connect(self.onPushButtonPivotal) 
     
     
        def onPushButtonPivotal(self):
            t = MainWindowOPO().actionLoadExperiment()
            print(t)
            self.close()
     
     
        #############################################################################################        
     
    ### Code minimal pour afficher l'interface graphique        
    if __name__.endswith('__main__'):
     
        if not QApplication.instance():
            MainApp = QApplication(sys.argv)
        else :
            MainApp = QApplication.instance()
     
    mainWindow = MainWindowOPO()
    mainWindow.show()
     
    rc = MainApp.exec_()
    sys.exit(rc)
    J'arrive à récupérer le nom qui m'intéresse mais le problème et que lorsque je fais ça, jé réexecute la fonction actionLoadExperiment entièrement alors que je ne voudrais récupérer que la variable self.loaded_filename.

    Est-ce possible de faire ça ou bien je suis dans l'obligation de réexécuter la fonction complètement ?

    Merci d'avance pour votre aide !

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

    Pour qu'une instance accède à l'attribut d'une autre instance, il faut qu'elle puisse tout d'abord accéder à l'instance.
    On peut le faire en la passant en paramètre lors de la création:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> class A:
    ...     def __init__(self):
    ...         self.a = 123
    ...
    >>> class B:
    ...     def __init__(self, object):
    ...         self.object = object
    ...     def show(self):
    ...         print(self.object.a)
    ...
    >>> b = B(A())
    >>> b.show()
    123
    >>>
    Et c'est mieux d'avoir un peu appris à se dépatouiller avec les bases de la POO avant de se lancer à Qt.

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

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 836
    Billets dans le blog
    1
    Par défaut
    Salut
    Citation Envoyé par Traxxael Voir le message
    Je pensais avoir compris comment échanger des variables entre 2 classes mais j'ai l'impression que non, surtout lorsque j'utilise des fenêtres Qt.
    Il y a plusieurs façons d'échanger deux infos entre deux objets Qt.

    Tout d'abord, si l'objet 2 est fils de l'objet 1, alors il le connait au travers du paramètre "parent". Suffit alors que l'objet 1 mémorise cette info dans un attribut et l'objet 2 peut alors chercher cet attribut. Et tu peux même te passer d'attribut car tout objet Qt possède une mémoire interne pouvant servir à mémoriser une information qui est alors récupérable quand c'est nécessaire. Tu peux sauvegarder une info dans objet1 via objet1.setData(Qt.UserRole, QVariant(info)) et tu peux ensuite récupérer plus tard l'info via info=objet1.data(Qt.UserRole). A toi d'organiser "info" pour y mettre tout ce que tu veux embarquer (via un dictionnaire par exemple).
    Exemple de démo ici.

    Ensuite tu peux embarquer carrément une information dans un signal émis. L'objet 1 émet le signal de cette façon sig[type_de_l_info].emit(info) et l'objet 2 qui a associé "sig" à un slot suivant cette syntaxe widget.sig[type_de_l_info].connect(slotX) déclare slotX ainsi
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @pyqtSlot(type_de_l_info)
    def slotX(info):
    	... (et ici accède à l info provenant de objet )...

    Exemple de démo ici.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 21
    Par défaut
    Bonjour,

    Merci à vous deux pour vos réponses.

    Sve@r, ta 1ere solution me parait la plus intuivite mais je coince encore. Dans mon exemple, lorsque j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MainWindowOPO.setData(Qt.UserRole, QVariant('str test'))
    , j'ai un message d'erreur qui stipule que MainWindowOPO n'a pas d'attributs setData.

    J'ai l'impression que c'est plutôt la syntaxe Qt qui me pose problème car pour l'instant je bricole en m'aidant de la doc Qt et PyQt5. Est-ce que vous auriez des ressources (gratuites de préférence !) qui explique en détails la prog Qt/PyQt5 ? J'ai déjà fait un peu de recherche mais j'ai l'impression de ne tomber systématiquement que sur des bouts de code et jamais sur quelque chose de global.

    Encore merci pour votre aide !

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Tu sembles confondre classe et instance. Tu as écrit mainWindow = MainWindowOPO() et je suppose que ta méthode setData() prend self en premier paramètre. Il faut appeler la méthode sur l'instance et non sur la classe.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 21
    Par défaut
    Merci pour ta réponse, j'ai oublié de préciser mais j'ai également essayé sur l'instance mainWindow et j'ai le même message d'erreur.

    Bref j'ai un peu du mal en Qt/PyQt5, je vais m'y mettre plus sérieusement !

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 836
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Traxxael Voir le message
    Bref j'ai un peu du mal en Qt/PyQt5, je vais m'y mettre plus sérieusement !
    Non c'est un peu ma faute. J'ai dit "les objets Qt" sous-entendu que c'était tous les objets mais en réalité ce ne sont que "certains objets", ceux qui héritent des QAbstractModelItem. Et un QMainWindow (parce que vu le nom je présume que ton MainWindowOPO est un QMainWindow) n'en fait pas partie.

    On peut passer par dessus cette difficulté car l'objet QAction possède aussi un setData() un peu différent (pas à lui fournir le type de data de type Qt.UserRole). On fournit la data et on la récupère
    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    act=QAction()
    act.setData(QVariant('str test'))
    ...
    ...
     
    print(act.data())          # str test
    Sauf que pour inclure cet outil dans un QMainWindow tu dois créer ton propre objet qui en hérite afin de pouvoir lui rajouter tes propres attributs et dans ce cas, autant mettre directement l'info en tant qu'attribut de ton objet.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/12/2005, 08h43
  2. [C#] Passage de variables entre 2 forms
    Par Tips dans le forum C#
    Réponses: 6
    Dernier message: 06/12/2005, 16h48
  3. Passage d'information entre deux fenêtres
    Par kuuya dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/08/2005, 14h35
  4. Passer une variable entre deux fenêtres
    Par DeezerD dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 17/08/2005, 09h52
  5. [langage] Probleme passage de variables entre modules
    Par Ludo167 dans le forum Langage
    Réponses: 4
    Dernier message: 13/08/2004, 12h25

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