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 :

chargement d'une image dans un canvas ne fonctionne pas quand effectué à l'intérieur une fonction


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de ryan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 956
    Billets dans le blog
    1
    Par défaut chargement d'une image dans un canvas ne fonctionne pas quand effectué à l'intérieur une fonction
    Bonjour à toutes et à tous!


    Je fais face à un comportement que je ne comprends pas...

    Voici un premier exemple. On y crée une fenêtre root (gris foncé), une frame (orange) et un canvas (noir). Ensuite on dessine un rectangle gris clair à l'intérieur du canvas. Je passe par une image car le but est de sauver le tout au format jpeg.

    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
     
    from tkinter import *
    from PIL import Image, ImageDraw, ImageTk
     
    root = Tk()
    root.resizable(False, False)
    root.geometry("600x600+0+0")
    root.configure(background="#454545")
     
    the_frame = Frame(root)
    the_frame.pack(side=LEFT)
     
    cnv = Canvas(the_frame, width=400, height=400, bg='RED')
    cnv.pack()
     
    pil_image = Image.new("RGB", (300, 300))
    draw = ImageDraw.Draw(pil_image)
     
    draw.rectangle((0, 0, 100, 100), fill=(125, 125, 125))
    image_tk = ImageTk.PhotoImage(pil_image)
     
    cnv.create_image(0, 0, anchor=NW, image=image_tk)
    cnv.update()
     
    root.mainloop()
    On reprend exactement la même structure, mais cette fois, on isole le dessin du rectangle gris clair et son chargement dans le canvas dans une fonction test():
    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
     
    from tkinter import *
    from PIL import Image, ImageDraw, ImageTk
    import time
     
    def test():
        draw.rectangle((0, 0, 100, 100), fill=(125, 125, 125))
        image_tk = ImageTk.PhotoImage(pil_image)
     
        cnv.create_image(0, 0, anchor=NW, image=image_tk)
        cnv.update()
        time.sleep(5)
     
     
    root = Tk()
    root.resizable(False, False)
    root.geometry("600x600+0+0")
    root.configure(background="#454545")
     
    the_frame = Frame(root)
    the_frame.pack(side=LEFT)
     
    cnv = Canvas(the_frame, width=400, height=400, bg='RED')
    cnv.pack()
     
    pil_image = Image.new("RGB", (300, 300))
    draw = ImageDraw.Draw(pil_image)
     
    test()
     
    root.mainloop()
    Et là, surprise (pour moi en tout cas), au bout des 5 secondes du timer, le canvas noir et son rectangle gris clair disparaissent(si on n'ajoute pas de timer, on a à peine le temps de voir le canvas et le rectangle)

    Je vous avoue que je n'ai pas la moindre idée de ce qui cause ce comportement étrange...

    Merci d'avance à celles et ceux qui pourraient m'aider à y voir plus clair.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Citation Envoyé par ryan Voir le message
    Je vous avoue que je n'ai pas la moindre idée de ce qui cause ce comportement étrange...
    Facile, au bout de 5 secondes, time.sleep se termine et la fonction test peut aussi se terminer et détruire les variables locales... dont celle qui référence l'image... et l'image disparaît.

    Normalement dans le chapitre de votre tuto. préféré qui parle des fonctions devrait expliquer la portée des variables...

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

  3. #3
    Membre Expert
    Avatar de ryan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 956
    Billets dans le blog
    1
    Par défaut
    Merci pour votre réponse.


    Je m'imaginais, naïvement , qu'une fois tracé dans le canvas, le rectangle allait y rester, de la même façon que les lignes tracées avec la méthode create_line de l'objet canvas y restent, même si elles ont été tracées dans une fonction. J'ai encore du chemin devant moi...

    Le problème a été réglé en déclarant dans la fonction la variable image_tk comme étant globale.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Citation Envoyé par ryan Voir le message
    Je m'imaginais, naïvement
    L'informatique n'a rien de naturel tout y a été créé artificiellement par l'homme... Il faut comprendre les contraintes que cherche à résoudre tkinter qui est juste une passerelle avec TCL/Tk.... Et ne pas oublier de lire (et relire) la documentation.

    - 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. Réponses: 7
    Dernier message: 11/03/2016, 20h22
  2. [Lazarus] Insérer une image dans un canvas
    Par anto974 dans le forum Lazarus
    Réponses: 3
    Dernier message: 14/05/2009, 19h09
  3. Insérer une image dans un canvas en XAML
    Par BlackStorm dans le forum Windows Forms
    Réponses: 7
    Dernier message: 12/07/2008, 15h39
  4. afficher une image dans un canvas
    Par alex.blais dans le forum Tkinter
    Réponses: 4
    Dernier message: 08/12/2007, 18h29
  5. afficher une image dans un canvas
    Par Arrakis dans le forum Tkinter
    Réponses: 1
    Dernier message: 05/03/2007, 13h22

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