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 :

Modification du contenu d'un canevas


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 12
    Points : 13
    Points
    13
    Par défaut Modification du contenu d'un canevas
    Bonjour,
    Je suis en train de coder un programme de traitement d'image avec une photo dans un canevas et plusieurs boutons permettant d'y appliquer des filtres (pour l'instant il n'y a que le bouton filtre rouge)
    Mon problème, c'est que lorsque que j'appuie sur le bouton (après bien sûr que la photo ai été placée ans la canevas), il ne se passe rien au niveau du canevas et je n'ai aucun message d'erreur.

    Voila le programme principal :
    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
     
    from tkinter import *
    from PIL import Image, ImageTk
    from operations_image import *
     
    global photo,L,H,dico_image
    photo,L,H=0,0,0
    dico_image={}
     
    def ouvrir(event):
        global photo,L,H,dico_image
        photo=Image.open(entree.get())
        dico_image['photo']= photo
        (L,H)=photo.size
        can.configure(width=L, height=H)
        photo_tk = ImageTk.PhotoImage(photo) 
        dico_image['photo tk'] = photo_tk
        can.delete(fen,ALL)
        can.create_image(L//2,H//2,image =photo_tk)
        can.pack(side=RIGHT)
     
    def traitement(operation):
        global dico_image
        traite=operation
        dico_image['photo traitee']=traite
        traite_tk=ImageTk.PhotoImage(traite)
        dico_image['photo traitee tk']=traite_tk
        can.delete(fen,ALL)
        can.create_image(L//2,H//2,image=traite_tk)
     
     
     
     
    if __name__ == "__main__":
    	fen=Tk()
    	can=Canvas(fen, width =5, height =5)
    	new=Traitement()
     
    	entree=Entry(fen)
    	entree.bind('<Return>',ouvrir)
    	entree.pack()
     
     
    	Button(fen,text='Filtre rouge',command=traitement(new.filtrerouge(photo,L,H))).pack(side=LEFT)
     
    	fen.mainloop()
    Et voilà operations_image.py :
    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 PIL import Image
     
    class Traitement(object):
     
        def filtrerouge(self,image,Longueur,Hauteur):
            "Filtre ne laissant passer que le rouge"
            self.filtrerouge=Image.new('RGB', (Longueur,Hauteur))
            for x in range(Longueur):
                for y in range (Hauteur):
                    p=image.getpixel((x,y))
                    self.filtrerouge.putpixel((x,y), (p[0],0,0))
            return self.filtrerouge
     
        def filtrevert(self,image,Longueur,Hauteur):
            "Filtre ne laissant passer que le vert"
            self.filtrevert=Image.new('RGB', (Longueur,Hauteur))
            for x in range(Longueur):
                for y in range (Hauteur):
                    p=image.getpixel((x,y))
                    self.filtrevert.putpixel((x,y), (0,p[1],0))
            return self.filtrevert
     
        def filtrebleu(self,image,Longueur,Hauteur):
            "Filtre ne laissant passer que le bleu"
            self.filtrebleu=Image.new('RGB', (Longueur,Hauteur))
            for x in range(Longueur):
                for y in range (Hauteur):
                    p=image.getpixel((x,y))
                    self.filtrebleu.putpixel((x,y), (0,0,p[2]))
            return self.filtrebleu
    Pourriez-vous m'aider ?

    PS : Mon ordinateur tourne sous Windows7 64 bits et j'utilise python 3.3.4

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Lorsque tu fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ... command=traitement(new.filtrerouge(photo,L,H))
    cela veux dire que commande = le retour de traitement(new.filtrerouge(...)) donc la commande est exécutée immédiatement et, qui plus est tu lui passe des arguments juste définis comme globaux mais ne référençant rien.

    donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ... command=traitement_rouge).pack(side=LEFT)
    et tu crées la fonction traitement_rouge()

    Autre chose, tu ne vois pas quelque chose qui cloche ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        def filtrerouge(self,image,Longueur,Hauteur):
            "Filtre ne laissant passer que le rouge"
            self.filtrerouge=Image.new('RGB', (Longueur,Hauteur))
            for x in range(Longueur):
                for y in range (Hauteur):
                    p=image.getpixel((x,y))
                    self.filtrerouge.putpixel((x,y), (p[0],0,0))
            return self.filtrerouge
    en regardant attentivement, hein.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    Le truc c'est que photo, L, et H sont modifiés par la fonction ouvrir et renvoient vers l'image PIL, sa largeur et sa hauteur, enfin je crois
    Pour la fonction filtrerouge je ne vois pas ce qui cloche : je l'ai testé à part et le résultat était au poil.
    On pourrait dire que la variable image ne renvoie à rien mais comme je place photo qui a été ouverte par PIL dans la fonction ouvrir, alors non, je ne vois pas.
    Et puis comme j'ai pas mal d'autres fonctions qui opèrent sur les images, je souhaiterais avoir une fonction qui les centraliserait toutes

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Citation Envoyé par Serratonique Voir le message
    Le truc c'est que photo, L, et H sont modifiés par la fonction ouvrir et renvoient vers l'image PIL, sa largeur et sa hauteur, enfin je crois
    Pour la fonction filtrerouge je ne vois pas ce qui cloche : je l'ai testé à part et le résultat était au poil.
    On pourrait dire que la variable image ne renvoie à rien mais comme je place photo qui a été ouverte par PIL dans la fonction ouvrir[
    Et où et quand est-elle appelée cette fonction ouvrir() ?

    Et puis comme j'ai pas mal d'autres fonctions qui opèrent sur les images, je souhaiterais avoir une fonction qui les centraliserait toutes
    Tu veux dire une classe qui les regroupe, je suppose. For bien mais mes commentaires restent à prendre en compte malgré tout.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    la fonction ouvrir est appelée avec l'opération entree.bind('<Return>',ouvrir) un peu plus haut que le code du bouton.
    Enfin bon je pense avoir compris : comme la commande s’exécute immédiatement, les variables photo, L et H n'ont pas le temps d'être modifiées par la fonction ouvrir et ainsi ça ne donne rien.
    Merci !

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 43
    Points : 60
    Points
    60
    Par défaut
    Bonjour,

    Sans répondre à ta question je souhaitais t'indiquer qu'il existait déjà une fonction sous PIL pour obtenir directement l'image en R uniquement (de même pour V et B). Il s'agit de faire un simple:

    Comme indiqué dans le FAQ.

    Tu peux également éviter de te trimbaler "Longueur" et "Hauteur" avec img.size[0] et img.size[1] vu que tu mettais déjà l'image en paramètre.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    Merci pour l'info !
    Mais le but est aussi de m’entraîner, comme je ne suis encore qu'un débutant, et donc il serait dommage (je trouve) de se laisser aller à la facilité pour le moment
    Pour Longueur et Hauteur, ce ne sont que des arguments, donc ça ne me gène pas trop, en plus ça permet de bien voir à quoi ça correspond d'une part et d'autre part étant donné que je fais le calcul image.size dans le programme principal, ça évite de faire des calculs pour rien...

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

Discussions similaires

  1. [COMBOBOX]Bloquer la modification du contenu
    Par stephane77fr dans le forum Windows Forms
    Réponses: 4
    Dernier message: 15/07/2007, 12h01
  2. Modification du contenu d'une page d'un repertoire virtuel
    Par celine_tr dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 24/08/2006, 16h17
  3. Réponses: 2
    Dernier message: 28/12/2005, 16h53
  4. [vb6 et access] problème de modification de contenu de champ
    Par dj_tess dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 22/12/2005, 19h26
  5. Modification du contenu d'un Request() ??
    Par nesbla dans le forum ASP
    Réponses: 5
    Dernier message: 05/07/2005, 14h31

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