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 :

Probleme image PILimage pour PhotoImage - pyimage doesnt exists


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Inscrit en
    Septembre 2005
    Messages
    617
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 617
    Par défaut Probleme image PILimage pour PhotoImage - pyimage doesnt exists
    Bonjour à tous,

    Est-ce que quelqu'un peut m'expliquer pourquoi ce code ne fonctionne pas?
    Je voudrais sauver l'image dans une variable pour permettre de préserver sa qualité et la redimensionner pour une utilisaiton ultérieure.

    J'ai fais une simulation en mouse enter et mouse leave.
    Le mouseleave pose un problème et je ne comprends pas pourquoi...

    L'image est bien présente puisque qu'un image.show fonctionne avant d'essayer de modifier l'image du label...

    bref je ne comprends pas...

    Merci de vos lumières !


    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    from functools import partial
    from  tkinter import *
    import pdf2image
     
    from PIL import Image, ImageTk
     
     
     
    class custombutton(Button):
     
        def click(self):
            print(self)
     
        def __init__(self, master, image, width=200, height=10,  previewlabel=None, **kwargs):
            Button.__init__(self, master, **kwargs)
     
            self.image=image
            self.width = width
            self.height = height
            self.previewlabel=previewlabel   
     
            self['width']=self.width
            self['height']=self.height
     
            self['image']=image
            self['command']=self.click
     
            self.pack()    
     
    def mouseover(image, e):
        lblimage['image']=image
     
    def mouseleave(image, e):
        imageresized=  ImageTk.PhotoImage(image.resize((200,200) , Image.NEAREST)) #-------- NOT WORKING
        lblimage['image'] =imageresized
     
    win= Tk()
    win.title("Hello")
     
    win.geometry("700x700")
     
    lblimage=Label(text="aaa")
    lblimage.pack()
     
    pages = pdf2image.convert_from_path('C:/Users/user1/test.pdf', poppler_path=r'C:\python\Lib\poppler-21.03.0\Library\bin')
     
     
    i=0
    for im in pages:
        i+=1
     
        srcimg=im
        resizedimg=ImageTk.PhotoImage(srcimg.resize((200,200) ,Image.NEAREST))
     
        button = custombutton(win, resizedimg, previewlabel=lblimage)
        button.bind("<Enter>", partial(mouseover,resizedimg))
        button.bind("<Leave>", partial(mouseleave,srcimg))  #----------------- NOT WORKING
     
     
    win.mainloop()

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

    C'est (toujours) le soucis lorsqu'on ne garde pas une référence à chaque image...
    Dans votre cas, seule la dernière image s'affiche et les autres disparaissent.

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

  3. #3
    Membre émérite
    Inscrit en
    Septembre 2005
    Messages
    617
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 617
    Par défaut
    Je ne comprends pas trop ce que tu veux dire.
    J'ai un peu modifié le code pour stocker les images dans des tableaux.
    Ce qui est perturbant c'est que srcimg[i].show() fonctionne tres bien dans le button leave event...

    Peux tu m'expliquer ce que tu entends par "le soucis lorsqu'on ne garde pas une référence à chaque image... "

    Merci d'avance,

    Vesta

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    from functools import partial
    from  tkinter import *
    import pdf2image
     
    from PIL import Image, ImageTk
     
     
     
    class custombutton(Button):
     
        def click(self):
            print(self)
     
        def __init__(self, master, image, width=200, height=10,  previewlabel=None, **kwargs):
            Button.__init__(self, master, **kwargs)
     
            self.image=image
            self.width = width
            self.height = height
            self.previewlabel=previewlabel   
     
            self['width']=self.width
            self['height']=self.height
     
            self['image']=image
            self['command']=self.click
     
            self.pack()
     
     
     
     
    def mouseover(image, e):
        lblimage['image']=image
     
    def mouseleave(i, e):
        srcimg[i].show()
        imageresized=  ImageTk.PhotoImage(srcimg[i].resize((200,200) , Image.NEAREST)) #-------- NOT WORKING
        lblimage['image'] =imageresized
     
    win= Tk()
    win.title("Hello")
     
    win.geometry("700x700")
     
    lblimage=Label(text="aaa")
    lblimage.pack()
     
    pages = pdf2image.convert_from_path('C:/Users/Vesta/Desktop/PLCI.pdf', poppler_path=r'C:\Users\Vesta\Desktop\python\Lib\poppler-21.03.0\Library\bin')
     
    srcimg=[]
    resizedimg=[]
     
    i=0
    for im in pages:
     
        srcimg.append(im)
        resizedimg.append(ImageTk.PhotoImage(srcimg[i].resize((200,200) ,Image.NEAREST)))
     
        button = custombutton(win, resizedimg[i], previewlabel=lblimage)
        button.bind("<Enter>", partial(mouseover,resizedimg[i]))
        button.bind("<Leave>", partial(mouseleave,i))  #----------------- NOT WORKING
        i+=1   
     
     
    win.mainloop()

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par Vesta Voir le message
    Peux tu m'expliquer ce que tu entends par "le soucis lorsqu'on ne garde pas une référence à chaque image... "
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def mouseleave(i, e):
        srcimg[i].show()
        resizedimg[i] = imageresized=  ImageTk.PhotoImage(srcimg[i].resize((200,200) , Image.NEAREST)) 
        lblimage['image'] =imageresized
    La PhotoImage est alors aussi référencée par la liste (globale) resizedimg et pas juste par la variable locale imageresized détruite à la sortie de la fonction (avec le PhotoImage associée si c'était la seule référence).

    note: On pourrait penser que l'instruction lblimage['image'] = imageresized ajoute une référence à la PhotoImage (je l'assigne à... comme le fait resizedimg[i] = imageresized).
    Ca se contente de donner accès à la PhotoImage depuis le côté TK de tkinter.
    Et comme la même PhotoImage peut être utilisée par plusieurs widgets, c'est compliqué de suivre les widgets qui... et savoir quand s'en débarrasser (et libérer la mémoire).

    A l'utilisateur de s'en dépatouiller en gérant ses références "à la main" comme documenté.

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

  5. #5
    Invité
    Invité(e)
    Par défaut
    Salut !
    C'est un problème bien connu.

    Une idée à adapter à ton code :
    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
    image1 = Image.open("hermine.jpg")
    image1 = ImageTk.PhotoImage(image1)
     
    image2 = Image.open("hermine-inv.jpg")
    image2 = ImageTk.PhotoImage(image2)
     
    label = Label(image=image1)
    label.image1 = image1
    label.image2 = image2
    label.bind("<Enter>",mouse_over)
    label.bind("<Leave>",mouse_leave)
     
    def mouse_over(event):
        label['image']=label.image2
     
    def mouse_leave(event):
        label['image']=label.image1
    Tu peux mettre une liste ou autres sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    label.images = [image1, image2, image3, ...]
    Je pense qu'il y a moyen de simplifier ton code.

  6. #6
    Membre émérite
    Inscrit en
    Septembre 2005
    Messages
    617
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 617
    Par défaut
    Merci pour vos explications !
    Cela fait des heures que je me prend la tête avec ca

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/05/2009, 14h04
  2. probleme de cast pour afficher une image
    Par scoobiflo dans le forum Graphisme
    Réponses: 9
    Dernier message: 30/11/2008, 22h52
  3. Probleme récupération image bdd pour affichage
    Par kakahn dans le forum Struts 1
    Réponses: 6
    Dernier message: 03/01/2008, 19h47
  4. Probleme utilisation skin pour images
    Par mictif dans le forum ASP.NET
    Réponses: 3
    Dernier message: 18/10/2007, 13h15
  5. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 13h26

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