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

Tkinter Python Discussion :

Afficher et rafraîchir une image dans une fonction [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2017
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Afficher et rafraîchir une image dans une fonction
    Bonjour,

    Je débute en python et à l'utilisation de Tkinter.
    J'ai besoin d'afficher dans un Canvas, une image récupérée sur internet (la météo) et de régulièrement rafraîchir celle-ci (toutes les heures par exemple).
    Voici le code que j'ai utilisé, avec une fonction (je n'ai pas mis toutes les déclaration préalables) :
    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
     
    def Meteo():
        r = requests.get('https://www.prevision-meteo.ch/uploads/widget/meudon-92_0.png')
        r.raise_for_status()
        with open("meteo_meudon.png", "wb") as code:
            code.write(r.content)
        #Chargement de l'image
        image_meteo = PIL.Image.open("meteo_meudon.png")
        photo_meteo = PIL.ImageTk.PhotoImage(image_meteo)
        canvas_meteo = Canvas(cadre_meteo, width = photo_meteo.width(), height = photo_meteo.height())
        #Affichage de l'image
        canvas_meteo.create_image(0, 0, image = photo_meteo, anchor = NW)
        canvas_meteo.pack()
        canvas_meteo.after(600000, Meteo)
    Meteo()
    Si je sort le code de la fonction, mon image s'affiche dans mon Canvas. Mais si je garde ma fonction, rien.
    Je pense qu'il y a un problème sur la déclaration des variables image_meteo et photo_meteo, mais je ne sais pas comment les déclarer en global.

    Merci pour votre aide.

    François

  2. #2
    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 fbr1969 Voir le message
    Je pense qu'il y a un problème sur la déclaration des variables image_meteo et photo_meteo, mais je ne sais pas comment les déclarer en global.

    Avec le mot clef "global" pour que l'objet PhotoImage référencé par la variable photo_meteo survive après la sortie de la fonction (comme mentionné dans la FAQ).
    Ceci dit, pourquoi créer un nouveau Canvas à chaque fois?
    De plus, il n'est pas nécessaire de stocker les données dans un fichier, en faire un fichier en mémoire avec io.BytesIO suffit.

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

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2017
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Avec le mot clef "global".
    Ceci dit, pourquoi créer un nouveau Canvas à chaque fois.
    De plus, il n'est pas nécessaire de stocker les données dans un fichier, en faire un fichier en mémoire avec io.BytesIO suffit.

    - W
    Merci Wiztrick, en suivant tout tes conseils, cela fonctionne et le code est un peu moins moche...
    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
     
    canvas_meteo = Canvas(cadre_meteo, width = 680, height = 320)
     
    def Meteo():
        global image_meteo
        global photo_meteo
        r = requests.get('https://www.prevision-meteo.ch/uploads/widget/meudon-92_0.png')
        if r.status_code == requests.codes.ok:
            image_meteo = PIL.Image.open(BytesIO(r.content))
            r.close()
        photo_meteo = PIL.ImageTk.PhotoImage(image_meteo)
        canvas_meteo.create_image(0, 0, image = photo_meteo, anchor = NW)
        canvas_meteo.pack()
        canvas_meteo.after(600000, Meteo)
    Meteo()

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 16/01/2015, 10h50
  2. [Débutant] Manipulation d'images : intégrer une image dans une image
    Par noscollections dans le forum VB.NET
    Réponses: 2
    Dernier message: 17/10/2014, 11h51
  3. Afficher une image d'une BD dans une page JSF
    Par kam81 dans le forum JSF
    Réponses: 4
    Dernier message: 06/09/2011, 21h51
  4. Afficher une image d'une DB dans une page web
    Par akaii dans le forum VB.NET
    Réponses: 1
    Dernier message: 09/03/2009, 10h56
  5. Afficher une image dans une cellule d'une gridview
    Par guigui11 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 13/09/2007, 10h18

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