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 :

Héritage multiple


Sujet :

PyQt Python

  1. #1
    Membre du Club
    Homme Profil pro
    Compositing / Pipeline
    Inscrit en
    Novembre 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Compositing / Pipeline
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2011
    Messages : 63
    Points : 45
    Points
    45
    Par défaut Héritage multiple
    Bonjour à tous,

    Ça fait quelques mois que j’apprends python (autodidacte) et plus particulièrement PySide pour pouvoir "greffer" les UI dans des logiciels d'image.
    Juste qu'a présent ça allait je me débrouillais, mais j'ai placé la barre un peu plus haut et je me retrouve bloqué avec les class...

    Pour faire simple, j'ai 2 fichiers (un pour les fonctions l'autre pour l'UI). Là ou je bloque (car mon UI est quand même bien fournit) c'est comment "organiser" mes class dans mon fichier fonctions ?
    Au lieu d'un long discours je vous fait un imprim' écrans.
    Nom : exemple.jpg
Affichages : 367
Taille : 93,9 Ko
    Ma première class concerne l'UI principalement (avec un import), puis je viens faire un héritage de cette Class (principale ??!) et ainsi de suite.
    Je ne sais pas si c'est la bonne solution de faire des SubClass comme ceci ? en fait c'est surtout pour moi coté code, afin d'avoir une meilleure lisibilité. Ranger dans des tirroirs (ici Class), par rapport à l'UI.
    Là ou je bloque et plus particulièrement avec la seconde Class (violette), c'est qu'il ne reconnait pas ma variable "amb":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class CreateCompMain(MainPanelUI):
        def __init__(self):
            super(CreateCompMain, self).__init__()
     
            ##SIGNALS##
            self.create_comp_create_btn.clicked.connect(self.set_create_comp)
     
            #DropDown :
            amb = self.create_comp_amb_dd.currentText()
     
        def set_create_comp(self):
            # Button
            print amb
    Retour de console:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "C:/Users/python/panel_func.py", line 116, in set_create_comp
        print amb
    NameError: global name 'amb' is not defined
    Si à la fin de mon code, je remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    app = QApplication(sys.argv)
    panel = SaveCompMain()
    panel.show()
    app.exec_()
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    app = QApplication(sys.argv)
    panel = CreateCompMain()
    panel.show()
    app.exec_()
    Ça fonctionne, j'ai bien mon print qui s’effectue.
    Donc je me posais la question, si se n'était pas du au multiple héritage de Class ?

    Pourtant jusqu'à présent sans passer par des UI, je commençais à mis faire de plus en plus au class, mais là avec l'interface ça m'embrouille...

    J'ai la tête dans le guidon donc j’espère avoir été au plus claire dans mes explications,
    En vous remerciant d'avoir pris le temps de lire jusqu'ici

    miaz3

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par Miaz3 Voir le message
    Ça fonctionne, j'ai bien mon print qui s’effectue.
    Donc je me posais la question, si se n'était pas du au multiple héritage de Class ?
    La portée d'une variable globale est limitée au module.
    créez module toto.py contenant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def foo():
          print ('foo', bar)
    puis vous l'utilisez avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    from foo import *
    bar = 123
    foo()
    çà plantera pareil car le "bar" demandé par "foo" n'existe pas dans le module "toto.py".

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

  3. #3
    Membre du Club
    Homme Profil pro
    Compositing / Pipeline
    Inscrit en
    Novembre 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Compositing / Pipeline
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2011
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    Bonjour,

    Pourtant si je déplace #DropDown dans la méthode plus bas "set_create_comp" :
    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
    class CreateCompMain(MainPanelUI):
        def __init__(self):
            super(CreateCompMain, self).__init__()
     
            ##SIGNALS##
            self.create_comp_create_btn.clicked.connect(self.set_create_comp)
        
        def collect_cp_module(self):
            #DropDown :
            amb = self.create_comp_amb_dd.currentText()
     
        def set_create_comp(self):
            #DropDown :
            amb = self.create_comp_amb_dd.currentText()
            print amb
    Ça fonctionne,
    Et logiquement, si je veux laisser ma ligne rouge (ci-dessus) je doit rajouter "self." devant "amb". Mais ça ne fonctionne pas...

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par Miaz3 Voir le message
    Ça fonctionne,
    Et logiquement, si je veux laisser ma ligne rouge (ci-dessus) je doit rajouter "self." devant "amb". Mais ça ne fonctionne pas...
    Dans ce cas, "amb" est local à la fonction "set_create_comp".
    Si vous ajoutez "self" vous avez un attribut d'instance, ce qui est encore autre chose...

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

  5. #5
    Membre du Club
    Homme Profil pro
    Compositing / Pipeline
    Inscrit en
    Novembre 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Compositing / Pipeline
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2011
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    D'accord, dans ce cas si je rajoute self. devant amb.

    ce qui me donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class CreateCompMain(MainPanelUI):
        def __init__(self):
            super(CreateCompMain, self).__init__()
     
            ##SIGNALS##
            self.create_comp_create_btn.clicked.connect(self.set_create_comp)
     
        def collect_cp_module(self):
            #DropDown :
            self.amb = self.create_comp_amb_dd.currentText()
     
        def set_create_comp(self):
            print self.amb
    j'ai toujours l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "C:/Users/python/panel_func.py", line 116, in set_create_comp
        print self.amb
    AttributeError: 'SaveCompMain' object has no attribute 'amb'

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Dans cette mouture de code, l'attribut "amb" ne sera définit qu'après un appel à "collect_cp_module".
    Pour éviter de genre de surprise, quand on débute, on s'applique à créer les attributs dans __init__, méthode qui sert à initialiser l'instance i.e. justement créer les attributs accédés par les différentes méthodes de la classe.

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

  7. #7
    Membre du Club
    Homme Profil pro
    Compositing / Pipeline
    Inscrit en
    Novembre 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Compositing / Pipeline
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Novembre 2011
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    Dans cette mouture de code, l'attribut "amb" ne sera définit qu'après un appel à "collect_cp_module".
    hehe, bhé oui...
    pff quelle nouille !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class CreateCompMain(MainPanelUI):
        def __init__(self):
            super(CreateCompMain, self).__init__()
            self.collect_cp_module()
    merci d'avoir pris le temps wiztricks !

    Sinon, dans l'idée de ranger les Classes/méthodes/variables comme je l'entreprend par rapport à l'UI, c'est une bonne idée ?!

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

Discussions similaires

  1. composants C++ Builder et héritage multiple
    Par vedrfolnir dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/10/2005, 10h04
  2. [heritage][conception]héritage multiple en java!
    Par soulhouf dans le forum Langage
    Réponses: 9
    Dernier message: 25/08/2005, 20h03
  3. L'héritage multiple est-il possible en Delphi ?
    Par SchpatziBreizh dans le forum Langage
    Réponses: 8
    Dernier message: 30/06/2005, 11h30
  4. utilisez vous l'héritage multiple ?
    Par vodosiossbaas dans le forum C++
    Réponses: 8
    Dernier message: 13/06/2005, 20h25
  5. [XML Schemas]héritage multiple
    Par nicolas_jf dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 10/06/2003, 12h55

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