Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tkinter - Modification de Labels non désirée

Une image disparait d'un Label lorsque j'en modifie un autre

Sujet résolu
    8 juin 2021 à 16:31:25

    Bonjour/Bonsoir à tous

    J'utilise Tkinter pour créer une petite application de traitement d'images, et je rencontre un petit problème : lorsque je modifie un certain label, un autre label est aussi modifié sans que je le veuille. Je vous mets les parties concernées de mon code et j'expliquerais le fonctionnement juste après :

    Voici tout d'abord les fonctions que j'utilise (le problème vient de la fonction "affichage_apercu", je vous mets les autres simplement pour que le programme fonctionne).

    ###### FONCTIONS ######
    
    def choose_file():
        global nom_image
        nom_image = askopenfilename(title = "Choisissez une image")
    
        image_origine_PIL = Image.open(nom_image)
        image_origine_PIL.thumbnail((200,200))
        image_origine_TK = ImageTk.PhotoImage(image_origine_PIL)
        
        LabelImageOrigine.configure = Label(fenetre, image = image_origine_TK).grid(column=0, row=2)
    
    
    def affichage_apercu(img):
        img.thumbnail((200,200))
        image_apercu_TK = ImageTk.PhotoImage(img)
        LabelImageApercu.configure = Label(fenetre, image = image_apercu_TK).grid(column=1, row=2)
    
    
    def filtre__r():
        img = Image.open(nom_image)
        L, H = img.size
        
        if img.getbands() == ('R', 'G', 'B'):
            for y in range(H):
                for x in range(L):
                    r,v,b = img.getpixel((x,y))
                    n_c = (r + 2*v + b) // 4
                    img.putpixel((x,y),(n_c, 0, 0))
            affichage_apercu(img)
            
        if img.getbands() == ('R', 'G', 'B', 'A'):
            for y in range(H):
                for x in range(L):
                    r,v,b,a = img.getpixel((x,y))
                    n_c = (r + 2*v + b) // 4
                    img.putpixel((x,y),(n_c, 0, 0, a))
            affichage_apercu(img)
            
        else:
            raise TypeError("Le format de l'image n'est pas reconnu")

    Et voici le programme principal :

    ###### PROGRAMME PRINCIPAL TKINTER ######  
    
    # Initialisation de la fenêtre
    fenetre = Tk()
    fenetre.geometry('500x600')
    
    
    # Affichage des images
    fond_image = PhotoImage(file = 'Images/fond_origine.png')
    fond_apercu = PhotoImage(file = 'Images/fond_apercu.png')
    
    LabelImageOrigine = Label(fenetre, image = fond_image).grid(column=0, row=2)
    LabelImageApercu = Label(fenetre, image = fond_apercu).grid(column=1, row=2)
    
    
    # Sélecteur de fichier
    Button(fenetre, text="Choisir un fichier", command = choose_file).grid(column=0, row=4)
    
    
    # Menu déroulant
    nom_image = 'Images/fond_apercu.png' #Je déclare cette variable pour permettre à la fonction filtre__r de fonctionner même si aucune image n'a été importée
    
    menubutton = Menubutton(fenetre, text = "Choisisez un effet")   
    menubutton.menu = Menu(menubutton)  
    menubutton["menu"]= menubutton.menu  
    menubutton.menu.add_command(label = "Filtre Rouge", command = filtre__r )  
    menubutton.grid(column=1, row=4)
    
    
    
    # Lancement de la fenêtre
    fenetre.mainloop()

    Vous aurez besoin de ces deux images placée dans un répertoire "Images", je vous laisse gérer en fonction de l'environnement que vous utilisez :

       

    Maintenant que vous avez tout ça, vous pouvez lancer vous même le programme et constater les problèmes, mais je vais quand même détailler le fonctionnement du code :

    • On clique sur le bouton qui déclanche la commande "choose_file". Cette commande importe une image, puis la redimensionne et l'affiche dans LabelImageOrigine (à gauche).

    • On utilise le menu pour choisir un filtre à appliquer (je n'en ai mis qu'un seul ici pour simplifier)

    • Le filtre s'applique à l'image dont le nom est stocké dans la variable globale "nom_image" donnée par "choose_file". Par défaut, "nom_image" désigne l'image d'origine de l'aperçu

    • La fonction "affichage_apercu" se lance à l'intérieur de la fonction "filtre__r". Cette fonction affiche l'image modifiée dans "LabelImageApercu" (à droite).

    Le problème, c'est que lorsque l'image modifiée est affichée, l'image d'origine disparaît de son label, je ne comprends pas pourquoi. Le plus étonnant, c'est que l'image d'origine reste en place si on n'utilise pas le bouton et qu'on applique le filtre directement à la première image.

    Merci à vous si vous avez pris la peine de lire, j'ai conscience que le programme est long mais j'ai enlevé beaucoup de détails.

    Merci pour vos réponses :)

    • Partager sur Facebook
    • Partager sur Twitter
      8 juin 2021 à 17:14:12

      Pour que l'image reste, il faut que tu conserve une réference du PhotoImage (la variable image_apercu_TK est supprimée en sortie de fonction), par exemple tu peux la mettre dans une liste globale.

      Mais normalement on fait du tkinter avec des classes.

      • Partager sur Facebook
      • Partager sur Twitter
        27 juin 2021 à 12:33:56

        Désolé de répondre si tard, j’avais complètement oublié 😅

        Merci pour ta réponse, j’ai corrigé le problème !

        Et pour les classes, je suis en première et on ne voit pas les classes avant la terminale, merci de m’avoir mis au courant.

        • Partager sur Facebook
        • Partager sur Twitter

        Tkinter - Modification de Labels non désirée

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown