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 d'argument entre classes [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2021
    Messages : 19
    Par défaut Passage d'argument entre classes
    Bonjour,
    je cherche à faire un arrosage automatique avec un ESP32 avec micropython, qui sera connecté à un serveur python qui recevra les prévisions météo du site Openweathermap.
    J'ai une interface Tkinter pour la collecte de ces informations et je butte sur l'affichage d'une image.png.
    J'ai le code suivant qui fonctionne :
    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
     
    from tkinter import *
    from PIL import Image, ImageTk
    import requests
     
     
    class Weather(object):
     
        def icone(self):
            icon_url = ('http://openweathermap.org/img/wn/01d@4x.png')
            im = Image.open(requests.get(icon_url, stream=True).raw)
            self.ph = ImageTk.PhotoImage(im)
            self.text_label='titi'
     
    root=Tk()
    trame=LabelFrame(root,bg='white',height=250,width=700)
    trame.grid()
    test=Weather()
    test.icone()
    label=Label(trame,text=test.text_label).grid()
    pic_label = Label(trame,image=test.ph,bg='white')
    pic_label.grid()

    Le label 'titi' et l'icone s'affichent, par contre si je crée une autre classe :

    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
     
    from tkinter import *
    from PIL import Image, ImageTk
    import requests
     
    class Weather(object):
     
        def icone(self):
            icon_url = ('http://openweathermap.org/img/wn/01d@4x.png')
            im = Image.open(requests.get(icon_url, stream=True).raw)
            self.ph = ImageTk.PhotoImage(im)
            self.text_label='titi'
     
    class Affiche(object):
        def trame(self):
            root=Tk()
            trame=LabelFrame(root,bg='white',height=250,width=700)
            trame.grid()
            test=Weather()
            test.icone()
            label=Label(trame,text=test.text_label).grid()
            pic_label = Label(trame,image=test.ph,bg='white')
            pic_label.grid()
     
    toto=Affiche()
    toto.trame()

    Cette fois le label 'titi' s'affiche mais pas l'image .png
    L'argument 'titi' passe bien d'une classe à l'autre mais pas l'image.
    Avez-vous une solution?
    Merci d'avance

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

    Vos codes sont "incomplets" on ne sait pas comment ils sont lancés ni si ils ont en relation l'un l'autre ou pas.

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

  3. #3
    Membre actif
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2021
    Messages : 19
    Par défaut Suite du message
    Je ne comprends pas la remarque.
    Les deux morceaux de code fonctionnent avec l'IDLE.
    Les voici avec quelques modifications pour les rendre plus lisibles:
    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
     
    #ne fonctionne pas comme prévu
    from tkinter import *
    from PIL import Image, ImageTk
    import requests
     
    class Weather(object):
     
        def icone(self):
            icon_url = ('http://openweathermap.org/img/wn/01d@4x.png')
            im = Image.open(requests.get(icon_url, stream=True).raw)
            self.ph = ImageTk.PhotoImage(im)
            self.text_label='titi'
     
    class Affiche(object):
        def trame(self):
            root=Tk()
            trame=LabelFrame(root,bg='white',height=250,width=700)
            trame.grid()
            test=Weather()
            test.icone()
            label=Label(trame,text=test.text_label).grid()
            pic_label = Label(trame,image=test.ph,bg='white')
            pic_label.grid()
    if __name__=="__main__":
        toto=Affiche()
        toto.trame()
    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
     
    #fonctionne comme prévu,mais pas comme je le souhaite
    from tkinter import *
    from PIL import Image, ImageTk
    import requests
     
    class Weather(object):
     
        def icone(self):
            icon_url = ('http://openweathermap.org/img/wn/01d@4x.png')
            im = Image.open(requests.get(icon_url, stream=True).raw)
            self.ph = ImageTk.PhotoImage(im)
            self.text_label='titi'
     
    if __name__=="__main__":        
        root=Tk()
        trame=LabelFrame(root,bg='white',height=250,width=700)
        trame.grid()
        test=Weather()
        test.icone()
        label=Label(trame,text=test.text_label).grid()
        pic_label = Label(trame,image=test.ph,bg='white')
        pic_label.grid()
    Qu'est-ce que je loupe?
    Merci d'avance

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 717
    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 717
    Par défaut
    Citation Envoyé par PLUB_85 Voir le message
    Les deux morceaux de code fonctionnent avec l'IDLE.
    Un code Python posté en exemple est supposé reproduire un problème... Et pour reproduire, on recopie le code dans un fichier et on lance le script correspondant depuis un terminal avec la commande "python le_script.py".
    note: tous les IDE ont des problèmes pour exécuter des codes Python et ce qui fait la différence entre un problème du à l'IDE et un problème du au programme, c'est le reproduire (ou pas) lancé normalement depuis un terminal.

    Si on fait çà avec vos scripts, ça ne fait rien de visible puisqu'il manque l'appel à mainloop (qui permettrait de visualiser quelque chose).

    Et si j'ajoute "intelligemment" un appel à mainloop dans votre code, il fonctionne très bien.
    "intelligemment" = dernière instruction de la méthode "trame".

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

  5. #5
    Membre actif
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2021
    Messages : 19
    Par défaut suite de suite
    en effet j'ai bien rajouté mainloop et cela fonctionne avec l'IDE et en fichier.py
    Question : quelle est la différence avec l'autre morceau de code, qui lui affiche bien l'icone sans mainloop
    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
    from tkinter import *
    from PIL import Image, ImageTk
    import requests
    
    class Weather(object):
                
        def icone(self):
            icon_url = ('http://openweathermap.org/img/wn/01d@4x.png')
            im = Image.open(requests.get(icon_url, stream=True).raw)
            self.ph = ImageTk.PhotoImage(im)
            self.text_label='titi'
            
    class Affiche(object):
        def trame(self):
            
            root=Tk()
            trame=LabelFrame(root,bg='white',height=250,width=700)
            trame.grid()
            test=Weather()
            test.icone()
            label=Label(trame,text=test.text_label).grid()
            pic_label = Label(trame,image=test.ph,bg='white')
            pic_label.grid()
            root.mainloop()#:D
    if __name__=="__main__":
        toto=Affiche()
        toto.trame()

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 717
    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 717
    Par défaut
    Citation Envoyé par PLUB_85 Voir le message
    quelle est la différence avec l'autre morceau de code, qui lui affiche bien l'icone sans mainloop
    Dans le premier code l'instance de Weather est stockée dans la variable globale "test" alors que dans le second, cette variable est locale (la méthode se termine, la variable est déréférencée et l'instance détruite ainsi que l'image).

    Quand j'ajoute mainloop (intelligemment) , la méthode ne se termine pas (et l'instance n'est pas déréférencée).

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

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

Discussions similaires

  1. Passage d'arguments entre 2 fonctions
    Par romain_t dans le forum Débuter
    Réponses: 3
    Dernier message: 27/11/2010, 12h15
  2. Passage de variable entre classes
    Par Xavier76 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 20/10/2010, 12h28
  3. Problème de passage de variable entre class
    Par yasen77 dans le forum Applets
    Réponses: 0
    Dernier message: 30/07/2010, 11h54
  4. passage de variables entre classes
    Par soujava dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 28/04/2008, 11h14
  5. [C#] Passage de valeur entre classes
    Par Neitsa dans le forum Windows Forms
    Réponses: 5
    Dernier message: 12/05/2006, 12h57

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