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 :

Passez des variables entre plusieurs classes sous PyQt5


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 21
    Points : 14
    Points
    14
    Par défaut Passez des variables entre plusieurs classes sous PyQt5
    Bonjour à tous,

    J'ai un petit problème avec le passage de variables entre classes et je n'arrive pas à trouver de solutions !

    J'ai 3 classes différentes (qu'on pourrait appeler start, main et save).
    La classe start me permet de récupérer un chemin d'accès (C:/Users/...). Une fois le chemin récupéré la fenètre start se ferme et lance la fenètre main.
    La classe main sert à faire une mesure stocké sous forme de liste et une fois la mesure faites ouvre une fenètre modale lié à la classe save.

    Ce que j'aimerais faire c'est récupérer dans ma classe save le chemin du fichier et la liste pour les sauvegarder. Mais je n'ai aucune idée de comment faire ça !
    J'ai essayé les signaux pyqtSignal, les variables globales, les self. ... mais rien ne fonctionne.

    Quelqu'un pourrait m'orienter sur une piste pour faire ce que je souhaite ?

    Merci d'avance !

    Code start : 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
     
    import os
     
    from PyQt5.QtWidgets import QWidget, QApplication, QFileDialog
    from PyQt5 import uic
     
    import Main
     
    class start(QWidget):
     
        def __init__(self, parent = None):
            super().__init__()
            uic.loadUi(__file__.split('.py')[0] + '.ui', self)
     
            self.pushButtonStart.clicked.connect(self.onPushButtonStart)   
     
        def onPushButtonStart(self):
     
            folder_name = self.lineEditUsername.text()
     
            dialog = QFileDialog()
            folder_path = dialog.getExistingDirectory(None, "Select Folder")
            folder_path_total = folder_path + os.path.sep + folder_name
     
     
            if os.path.isdir(folder_path_total) == True:
                self.startMainWindow = Main.main()
                self.close()
                self.startMainWindow.show()
     
            else:
                os.mkdir(folder_path_total)
                self.startMainWindow = Main.main()
                self.close()
                self.startMainWindow.show()

    Code main : 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
     
     
    ### Import des classes pour les fenetres pop-up ###############################
     
    import Save
     
    ###############################################################################
     
    ### Import des modules pour la gestion de Qt ##################################
     
    from PyQt5 import uic, QtCore
    from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog
     
    ###############################################################################
     
     
    ### Partie interface graphique et controle ####################################
     
    class MainWindowFluorescenceApplication(QMainWindow):
     
        def __init__(self,parent = None):
            super().__init__()
            uic.loadUi(__file__.split('.py')[0] + '.ui', self)
     
            ### Connexion signaux-slot ######################
     
            self.pushButtonAcquisitionSpectre.clicked.connect(self.onPushButtonAcquisitionSpectreClicked)
     
            #################################################
     
        ### Méthode des signaux-slot ##################################
     
        def onPushButtonAcquisitionSpectreClicked(self, filename):
     
                ### Acquisition des données avec le spectro ###############
     
                Wavelengths = spec.wavelengths()
                Intensities = spec.intensities()
     
                Data =[Wavelengths, Intensities]
                Data = list(Data)
     
                #### Sauvegarde des données ################################
     
                self.saveData = Save.save()
                self.saveData.setWindowModality(QtCore.Qt.ApplicationModal)
                self.saveData.show()

    Code save : 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
     
    import os
    import json
     
    from PyQt5.QtWidgets import QWidget, QFileDialog
    from PyQt5 import uic
     
    import Start
    import Main
     
    class save(QWidget):
     
        def __init__(self, parent = None):
            super().__init__()
            uic.loadUi(__file__.split('.py')[0] + '.ui', self)
     
            self.pushButtonSave.clicked.connect(self.onPushButtonSaveClicked)
            self.pushButtonCancel.clicked.connect(self.onPushButtonCancelClicked)     
     
        def onPushButtonSaveClicked(self):
     
            a = self.fenetre_demarrage.StartingSoftware.folder_path_sgn.connect()
            print(a)
     
    #        save_name = folder_path_total + os.path.sep + self.lineEditFilename.text()
    #        print(save_name)
    #        file = open(save_name+'.json', 'w+')
    #        json.dump(Data, file)
    #        print(save_name)
    #        print(Data)
     
    #        self.save_filename.emit(self.lineEditFilename.text())
            self.close()
     
        def onPushButtonCancelClicked(self):
            self.close()

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Bonjour,

    Ce que j'aimerais faire c'est récupérer dans ma classe save le chemin du fichier et la liste pour les sauvegarder
    Vous êtes conscient que vous devez importer start dans save pour que cela puisse se faire ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  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,

    Citation Envoyé par Traxxael Voir le message
    Ce que j'aimerais faire c'est récupérer dans ma classe save le chemin du fichier et la liste pour les sauvegarder. Mais je n'ai aucune idée de comment faire ça !
    Une façon simple sera de passer ces informations de start à main en les passant en paramètres puis de main à save de la même façon.

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

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Bonjour,

    Vous êtes conscient que vous devez importer start dans save pour que cela puisse se faire ?
    J'en suis bien conscient, j'ai corrigé l'erreur dans mon code initial. Dans mon programme je n'utilise pas start, main et save mais d'autres noms. J'ai choisi ceux là pour simplifier la présentation.


    Citation Envoyé par wiztricks Voir le message
    Salut,



    Une façon simple sera de passer ces informations de start à main en les passant en paramètres puis de main à save de la même façon.

    - W

    Merci pour la piste mais comment les passer en paramètres ?

  5. #5
    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,

    Citation Envoyé par Traxxael Voir le message
    Merci pour la piste mais comment les passer en paramètres ?
    "passer en paramètre" est un chose que vous avez normalement vu avec les fonctions non?

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

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    "passer en paramètre" est un chose que vous avez normalement vu avec les fonctions non?

    - W
    Oui mais je pense que je n'ai pas saisi toutes les subtilités . J'ai essayé quelque chose comme ça (seulement le start et save pour simplifier) :

    Code start : 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
     
    import os
     
    from PyQt5.QtWidgets import QWidget, QApplication, QFileDialog
    from PyQt5 import uic
     
    import Main
     
    class start(QWidget):
     
        def __init__(self, parent = None):
            super().__init__()
            uic.loadUi(__file__.split('.py')[0] + '.ui', self)
     
            self.pushButtonStart.clicked.connect(self.onPushButtonStart)   
     
        def onPushButtonStart(self):
            global folder_path_name
     
            folder_name = self.lineEditUsername.text()
     
            dialog = QFileDialog()
            folder_path = dialog.getExistingDirectory(None, "Select Folder")
            folder_path_total = folder_path + os.path.sep + folder_name
     
     
            if os.path.isdir(folder_path_total) == True:
                self.startMainWindow = Main.main()
                self.close()
                self.startMainWindow.show()
     
            else:
                os.mkdir(folder_path_total)
                self.startMainWindow = Main.main()
                self.close()
                self.startMainWindow.show()
     
        def passFolderName():
            global folder_path_name
     
            b = folder_path_name
            return b

    Code save : 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 os
    import json
     
    from PyQt5.QtWidgets import QWidget, QFileDialog
    from PyQt5 import uic
     
    import fenetre_demarrage
    import Fluorescence_application
     
    class PopUpSaveData(QWidget):
     
        def __init__(self, parent = None):
            super().__init__()
            uic.loadUi(__file__.split('.py')[0] + '.ui', self)
     
            self.pushButtonSave.clicked.connect(self.onPushButtonSaveClicked)
            self.pushButtonCancel.clicked.connect(self.onPushButtonCancelClicked)     
     
        def onPushButtonSaveClicked(self):
     
            a = Start.start.passFolderName()
            print(a)

    Mais ça ne fonctionne pas et je ne vois pas d'où vient mon erreur...

  7. #7
    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
    Citation Envoyé par Traxxael Voir le message
    Mais ça ne fonctionne pas et je ne vois pas d'où vient mon erreur...
    Ben, vous créez 2 classes A et B puis vous essayez de voir comment des instances de ces classes pourraient échanger des informations entre elles avec une hiérarchie semblable à celle de votre code: A saisit un nom de fichier et crée un B en le lui passant.

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

  8. #8
    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,

    Le problème n'est pas de partager une variable entre plusieurs classes, mais entre plusieurs fichiers. Si les classes se trouvaient dans un seul fichier, il suffirait de créer une variable globale.

    Il m'est déjà arrivé de vouloir rendre une variable partagée entre plusieurs fichiers importés, voilà comment je fais:

    Le programme principal "programme.py":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A = 5 # variable globale à partager avec les fichiers importés
     
    import bibliotheque
     
    print(A)
    Le fichier importé "bibliotheque.py":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import sys
     
    prog = sys.modules['__main__']
     
    print(prog.A)
     
    prog.A = 9
    On voit bien qu'au lancement du programme principal:
    - le module importé "bibliotheque" a bien accès à la variable A (print(prog.A) affiche 5),
    - qu'il peut la modifier (prog.A = 9),
    - et que cette modification est bien reçue par le programme principal (print(A) affiche 9).

    De la même façon, on peut accéder à des fonctions du programme principal à partir des modules importés.

    Je ne sais pas si c'est une méthode "homologuée", mais elle fonctionne, et elle m'a déjà permis de simplifier certaines parties de mes codes.

    A utiliser avec modération (comme les variables globales)
    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

Discussions similaires

  1. Modifier variable entre plusieurs classes
    Par asallou dans le forum Débuter avec Java
    Réponses: 14
    Dernier message: 26/03/2013, 09h28
  2. Réponses: 9
    Dernier message: 27/02/2011, 14h49
  3. Partager une variable entre plusieurs classes
    Par jasonpolakow dans le forum Windows Forms
    Réponses: 8
    Dernier message: 06/01/2011, 10h02
  4. Comment passer des variables entre classe ?
    Par flingue dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 02/04/2009, 08h28
  5. Partager des variables entre plusieurs actions ds un controlleur
    Par gvdmoort dans le forum Ruby on Rails
    Réponses: 6
    Dernier message: 11/10/2007, 09h38

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