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 :

Projet de GUI en Tkinter : Ouvrir une image, la traiter avec un algorithme, puis enregistrer le résultat.


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Par défaut Projet de GUI en Tkinter : Ouvrir une image, la traiter avec un algorithme, puis enregistrer le résultat.
    Bonjour à tous,

    Je vous recontacte aujourd'hui concernant mon projet.
    Vous pouvez trouver la première discussion concernant ce dernier ici :
    http://www.developpez.net/forums/d14...-s-projet-gui/

    Suite à cette discussion et aux retours que j'ai perçu, j'ai modifié mon projet de cette manière :
    Mon projet se décomposera en deux parties, une première via une GUI (écrite en Tkinter) puis une deuxième sous le logiciel ArcGis.

    Vous vous en doutez, on va s'intéresser à la première partie .
    Via la GUI,
    1- Mon programme devra recevoir une image de "n'importe" quel type (tiff, jpeg, png de préférence).
    2- Cette image, une fois ouverte, pourra être traitée par un algorithme de traitement d'image dont les paramètres seront modifiables par l'utilisateur (entry ou scale).
    3- Le résultat produit sera ensuite affiché.
    4- L'utilisateur pourra alors soit recommencé le traitement sur l'image initiale en changeant les paramètres, soit enregistrer le résultat dans le type qu'il souhaite.

    Plus précisément, j'en suis environ à l'étape "2-".

    Voici mon 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
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    from tkinter import *
    import numpy as np
    import matplotlib.pyplot as plt
     
    from skimage import data
    from PIL import Image as imge
    from PIL import ImageTk as imtk
    from scipy import ndimage
    from skimage import morphology
    from skimage.filter import sobel
     
    class AppUI(Frame):
     
        def __init__(self, master=None):
            Frame.__init__(self, master,relief=SUNKEN,bd=2)
            self.menubar = Menu(self)
            menu = Menu(self.menubar, tearoff=0)
            self.menubar.add_cascade(label="Fichier", menu=menu)
            menu.add_command(label="Ouvrir une image", command=self.ouvrir)
            menu.add_command(label="Fermer l'image", command=self.fermer)
            menu.add_command(label="Enregistrer le résultat", command=self.enregistrer, state='disabled')
            #menu.add_command(label="Quitter", command=root.destroy)
            menu = Menu(self.menubar, tearoff=0)
            self.menubar.add_cascade(label="Traitement", menu=menu)
            menu.add_command(label="Algo 1", command=self.edit)
            menu.add_command(label="Algo 2", state='disabled')
            menu.add_command(label="Algo 3", state='disabled')
            self.menubar.add_command(label="Calculer", command=self.calculer)
     
            self.master.config(menu=self.menubar)
     
            try:
                self.master.config(menu=self.menubar)
            except AttributeError:
                # master is a toplevel window (Python 1.4/Tkinter 1.63)
                self.master.tk.call(master, "config", "-menu", self.menubar)
     
            self.can = Canvas(self, bg="white", width=400, height=400,
    			     bd=0, highlightthickness=0)
            self.can.pack()
            #self.lab = Scale(length=300, orient=HORIZONTAL, sliderlength=20,
            #      label='Paramètre :', from_=1, to=10, tickinterval =1, showvalue =1, command=self.updatelabel)
            #self.lab.configure(bg='white', bd=2, relief=SOLID)
            #self.lab.pack()
     
            bouton_sortir = Button(self,text="Quitter",command=self.end)
            bouton_sortir.pack()
            topho = 0
     
        def end(self):
            if messagebox.askyesno('Question',"Êtes-vous sûr de vouloir partir ?"):
                messagebox.showinfo('Message',"A bientôt !")
                root.destroy()
            else:
                messagebox.showwarning('Mais...', "Pourquoi t'appuies sur quitter alors ? -_-")
     
        def ouvrir(self):
            # Utilisation d'un dictionnaire pour conserver une référence
            gifdict={}
            # on efface la zone graphique
            self.can.delete(ALL) #-> AttributeError: 'str' object has no attribute 'tk'
     
            filename = filedialog.askopenfilename(title="Ouvrir une image",filetypes=[('tiff files','.tif'),('jpeg files','.jpg'),
                                                                ('png files','.png'),('gif files','.gif'),('all files','.*')])
            print(filename)
            monimage = imge.open(filename)
            photo = imtk.PhotoImage(monimage)
            #photo = PhotoImage(file=filename)
            gifdict[filename] = photo  # référence
            print(gifdict)
            self.topho = photo
     
            self.can.config(height=photo.height(),width=photo.width())
            self.can.create_image(0,1,anchor=NW,image=photo)
                                    #ligne suivante créée car si pas de ligne de commande sur self.can, image apparaît pas dans canevas
            #self.can.create_title("Image "+str(photo.width())+" x "+str(photo.height()))
     
        def fermer(self):
            self.can.delete(ALL)
            self.title("Image")
     
        def enregistrer(self): print ("enregistrer")
     
        def calculer(self): print ("calculer")
     
        def edit (self): #algorithme de traitement d'image
            #-------------------- Transformation 3D -> 2D (gray levels)
            gray = self.topho.convert('L')   # 'L' stands for 'luminosity'
            coins = np.asarray(gray)
            #-------------------- Elevation map (Sobel gradient)
            elevation_map = sobel(coins)
     
            #-------------------- Find markers : histogram of grey values
            markers = np.zeros_like(coins) #retourne une image de zero de même type/forme
                                           #et dimension que l'input
            markers[coins < 80] = 3
            markers[coins > 160] = 1
     
            plt.figure(figsize=(8, 6))
            plt.imshow(markers, cmap=plt.cm.spectral, interpolation='nearest')
            plt.axis('off')
            plt.title('markers')
     
            #-------------------- Watershed transform
            segmentation = morphology.watershed(elevation_map, markers)
     
            plt.figure(figsize=(8, 6))
            plt.imshow(segmentation, cmap=plt.cm.gray, interpolation='nearest')
            plt.axis('off')
            plt.title('Segmentation')
     
            plt.show()
     
     
    root = Tk()
     
    app = AppUI(root)
    app.pack()
     
    root.mainloop()
    Deux problèmes principaux se posent à moi :
    1- A la fin de la définition de "ouvrir", create_title ne fonctionne pas si je le dé-commente. J'obtiens le message d'erreur suivant :

    Exception in Tkinter callback
    Traceback (most recent call last):
    File "C:\Python33\lib\tkinter\__init__.py", line 1475, in __call__
    return self.func(*args)
    File "C:\Users\huguen_p\Desktop\Test programme python\tkinter.py", line 77, in ouvrir
    self.can.create_title("Image "+str(photo.width())+" x "+str(photo.height()))
    AttributeError: 'Canvas' object has no attribute 'create_title'


    Edit : J'allais écrire que "De plus, si je n'active pas cette ligne de commande (ou une autre modifiant self.can), mon image ne s'affiche pas dans le canevas", mais je viens de tester et elle s'affiche.. passons.


    2- Deuxième point problématique : Je souhaite donc traiter mon image via l'algorithme définie dans "edit" (ligne 86 du code), mais j'ai du mal avec le lien entre l'image ouverte par "ouvrir" (ligne 57 du code) et le nom que je lui donne dans "edit" (ligne 88 du code, "self.topho").
    J'obtiens le message d'erreur suivant :
    Exception in Tkinter callback
    Traceback (most recent call last):
    File "C:\Python33\lib\tkinter\__init__.py", line 1475, in __call__
    return self.func(*args)
    File "C:\Users\huguen_p\Desktop\Test programme python\tkinter.py", line 89, in edit
    gray = self.topho.convert('L') # 'L' stands for 'luminosity'
    AttributeError: 'PhotoImage' object has no attribute 'convert'




    Pensez-vous pouvoir m'aider à régler ces problèmes ?

    Merci pour vos futurs réponses.
    Je reste à votre disposition pour toutes suggestions.

    Cordialement,
    Pierre.

    PS: Pardonnez mon humour avec les showwarnings

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par pialhg Voir le message
    Bonjour à tous,

    Je vous recontacte aujourd'hui concernant mon projet.
    Vous pouvez trouver la première discussion concernant ce dernier ici :
    http://www.developpez.net/forums/d14...-s-projet-gui/

    Suite à cette discussion et aux retours que j'ai perçu, j'ai modifié mon projet de cette manière :
    Mon projet se décomposera en deux parties, une première via une GUI (écrite en Tkinter) puis une deuxième sous le logiciel ArcGis.

    Vous vous en doutez, on va s'intéresser à la première partie .
    Via la GUI,
    1- Mon programme devra recevoir une image de "n'importe" quel type (tiff, jpeg, png de préférence).
    2- Cette image, une fois ouverte, pourra être traitée par un algorithme de traitement d'image dont les paramètres seront modifiables par l'utilisateur (entry ou scale).
    3- Le résultat produit sera ensuite affiché.
    4- L'utilisateur pourra alors soit recommencé le traitement sur l'image initiale en changeant les paramètres, soit enregistrer le résultat dans le type qu'il souhaite.

    Plus précisément, j'en suis environ à l'étape "2-".

    Voici mon code :
    (snip)(snip)
    Deux problèmes principaux se posent à moi :
    1- A la fin de la définition de "ouvrir", create_title ne fonctionne pas si je le dé-commente. J'obtiens le message d'erreur suivant :

    Exception in Tkinter callback
    Traceback (most recent call last):
    File "C:\Python33\lib\tkinter\__init__.py", line 1475, in __call__
    return self.func(*args)
    File "C:\Users\huguen_p\Desktop\Test programme python\tkinter.py", line 77, in ouvrir
    self.can.create_title("Image "+str(photo.width())+" x "+str(photo.height()))
    AttributeError: 'Canvas' object has no attribute 'create_title'


    Edit : J'allais écrire que "De plus, si je n'active pas cette ligne de commande (ou une autre modifiant self.can), mon image ne s'affiche pas dans le canevas", mais je viens de tester et elle s'affiche.. passons.


    2- Deuxième point problématique : Je souhaite donc traiter mon image via l'algorithme définie dans "edit" (ligne 86 du code), mais j'ai du mal avec le lien entre l'image ouverte par "ouvrir" (ligne 57 du code) et le nom que je lui donne dans "edit" (ligne 88 du code, "self.topho").
    J'obtiens le message d'erreur suivant :
    Exception in Tkinter callback
    Traceback (most recent call last):
    File "C:\Python33\lib\tkinter\__init__.py", line 1475, in __call__
    return self.func(*args)
    File "C:\Users\huguen_p\Desktop\Test programme python\tkinter.py", line 89, in edit
    gray = self.topho.convert('L') # 'L' stands for 'luminosity'
    AttributeError: 'PhotoImage' object has no attribute 'convert'




    Pensez-vous pouvoir m'aider à régler ces problèmes ?

    Merci pour vos futurs réponses.
    Je reste à votre disposition pour toutes suggestions.

    Cordialement,
    Pierre.

    PS: Pardonnez mon humour avec les showwarnings
    Bonjour,

    Que signifient en français :

    AttributeError: 'PhotoImage' object has no attribute 'convert'
    Et

    AttributeError: 'Canvas' object has no attribute 'create_title'
    Note: on appelle 'Attribut' tout composant d'une classe (méthode, propriété, variable membre, sous-classe incluse, etc).

    Conclusion ?

    Documentation officielle de Tkinter.Canvas :

    http://infohost.nmt.edu/tcc/help/pub...eb/canvas.html

    Documentation (un peu moins) officielle de Tkinter.PhotoImage :

    http://effbot.org/tkinterbook/photoimage.htm

    Documentation officielle Tkinter (à mettre dans toutes les poches) :

    http://infohost.nmt.edu/tcc/help/pub...web/index.html

    Autre façon de se documenter :

    Ouvrir une console Python3+ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ python3
     
    >>> import tkinter
     
    >>> help(tkinter.PhotoImage)   # presser 'q' pour sortir de l'aide
     
    >>> help(tkinter.Canvas)   # presser 'q' pour sortir de l'aide
    wey wey wey, ça marche aussi, ça, mon bon m'sieur.

    @++.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Par défaut
    Merci pour ces informations.

    Néanmoins, cela ne répond pas à mon deuxième problème (j'ai du mal m'expirmer) :
    Je ne comprend pas pourquoi il fait le lien entre PhotoImage et convert.

    Que dois-je faire (comment la stocker ?) de ma photographie pour qu'il n'ait plus ce problème ?

    Merci.

    Pierre.
    --------------------------------------------------
    Edit1:
    Bon du coup pour régler mon problème, j'ai supposé que mon algorithme de traitement d'image ne devait pas accepter une image formatée pour être lu par Tkinter.
    Donc dans mon "self.topho" j'ai placé non pas "photo" (Image formaté par ImageTk pour être lu par tkinter) comme dans le code précédant, mais "monimage" (Image ouverte avec PIL).

    Malheureusement, un autre problème est revenu à la surface !

    Dans la définition de ouvrir, je souhaite afficher tout à la fin mon image ("image=photo"). Le cadre de la fenêtre s'adapte bien à mon image lorsque j'ouvre cette dernière. Cependant, le fond reste blanc et l'image n'apparaît pas. Je n'obtiens aucun message d'erreur.
    Bizarrerie.. si je dé-commente la ligne "self.can.create...." qui suit mon affichage d'image : J'ouvre mon image et cette fois-ci j'obtiens le message d'erreur pour le "self.can.create...." (normal !) mais mon image s'affiche oO !

    HEeeeeee comprend pas .

  4. #4
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Tu confonds PIL Image et PIL ImageTk.

    La première classe possède une méthode convert, pas l'autre.

    http://effbot.org/imagingbook/image.htm
    http://effbot.org/imagingbook/imagetk.htm

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/02/2013, 23h05
  2. [Tkinter] Insérer une image jpg sur un canvas avec PIL
    Par Kyojimbo dans le forum Tkinter
    Réponses: 2
    Dernier message: 23/02/2006, 16h46
  3. [Tkinter] Afficher une image animée
    Par Chris33 dans le forum Tkinter
    Réponses: 3
    Dernier message: 16/12/2005, 23h14
  4. [Tkinter] Afficher une image autre que gif
    Par mcdonald dans le forum Tkinter
    Réponses: 1
    Dernier message: 26/11/2005, 19h41
  5. Ouvrir une image avec paint depuis un formulaire
    Par gui38 dans le forum Access
    Réponses: 3
    Dernier message: 14/11/2005, 16h40

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