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 :

rafraichir un Canvas + une abération :/


Sujet :

Tkinter Python

  1. #1
    Membre régulier

    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 70
    Points : 71
    Points
    71
    Par défaut rafraichir un Canvas + une abération :/
    bonjour,
    Voila je vient poster ici dans le but d'avoir une réponse (n'est ce pas extraordinaire !? ^^).
    J'ai fait un petit programme pour aller chercher la liste des images qui sont classée dans plusieurs dizaines de répertoires (c'est pour m'aider pour ma modélisation 3D, ce sont des répertoire de texture). il va m'afficher le nom de toutes ces images dans un listBox. (et plein d'autre chose) il me reste plus qu'a cliquer pour que mon image s'affiche en 256x256 dans un canvas prévue à cet effet. Mais voila, le Canvas est créé des le début et l'image ne s'affiche pas. Je voudrais alors juste savoir comment faire pour "Rafraîchir" le Canvas?
    si vous avez bien tous compris, merci de me laisser une petite réponse ^^

    maintenant => L'ABERATION !!
    c'est toujours mon canvas O_o. lorsque que je génère une erreur volontairement, l'image s'affiche ...
    et voici la partie de mon code qui nous intéresse !
    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
     def clic(self, evt):
     i=App.imagesList.curselection() ## Récupération de l'index de l'élément sélectionné
     IMAGE = App.imagesList.get(i)
    IMAGEDirectory = dict_Walk[IMAGE]
    print IMAGEDirectory
     image = Image.open(IMAGEDirectory + "/" + str(IMAGE)).convert("RGBA")
     image.thumbnail((256,256), Image.ANTIALIAS)
    print "-----------image redimensionner--------------------"
     photo = ImageTk.PhotoImage(image)
    App.canvasImages.delete(ALL)
    print "----------Canvas netoyé ---------------------------"
    App.canvasImages.create_image(256/2,256/2,image=photo)
    print "----------Image affichée --------------------------"
    App.canvasImages.grid()
    App.canvasImages.haha() # <== erreur volontaire ...

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Les widgets ont une méthode update pour les mettre à jour.
    La méthode update_idletasks permets de le daire avant la fin du traitement.

    Sinon pourquoi utiliser un .delete plutôt qu'un .itemconfigure ?

    Bon code
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Membre régulier

    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 70
    Points : 71
    Points
    71
    Par défaut
    je ne connaissait pas .itemconfigure . par contre, je comprend comment l'utiliser mais je n'arrive pas a m'en servir dans mon cas. comment changer l'image du canvas? Je suis sur que c'est asser bête mais cela reste un mystere pour moi.
    peut être qu'avec la source complete vous y verrer plus clair :
    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
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
     
    # -*- coding: iso-8859-15 -*-
     
    from Tkinter import *
    from PIL import Image, ImageTk 
    from threading import Thread
    import os.path, string
     
    dict_Walk = {}
    list_Extension = [".jpg", ".JPG", ".PNG", ".png", ".tga",
                    "jpeg", "JPEG"]
    list_ImagesPrep = []
     
     
    class Visualisateur_Images(Frame):
        def __init__(self):
            Frame.__init__(self)
     
            self.bouttonRafraichir = Button(self,
                font = "{MS Sans Serif} 10",
                foreground = "#0000ff",
                relief = "groove",
                text = "Rafraichir",
                command = self.DEF_Rafraichir
            )
            self.bouttonQuitter = Button(self,
                font = "{MS Sans Serif} 10",
                foreground = "red",
                relief = "groove",
                text = "Quitter",
                command = self.master.destroy
            )
            self.canvasImages = Canvas(self,
                background = "#ffffff",
                relief = "solid",
                height = 256,
                width = 256,
            )
            self.imagesList = Listbox(self,
                height = 15,
                width = 25,
            )
            self.TextInformation = Text(self,
                height = 15,
                width = 15,
            )
     
     
            self.bouttonRafraichir.grid(
                in_    = self,
                column = 1,
                row    = 1,
                columnspan = 1,
                rowspan = 1,
                sticky = ""
            )
            self.bouttonQuitter.grid(
                in_    = self,
                column = 2,
                row    = 1,
                columnspan = 1,
                rowspan = 1,
                sticky = ""
            )
            self.canvasImages.grid(
                in_    = self,
                column = 1,
                row    = 2,
                columnspan = 1,
                rowspan = 1,
                sticky = "news"
            )
            self.imagesList.grid(
                in_    = self,
                column = 2,
                row    = 2,
                columnspan = 1,
                rowspan = 1,
                sticky = "news"
            )
            self.TextInformation.grid(
                in_ = self,
                column = 1,
                row = 3,
                columnspan = 2,
                rowspan = 1,
                sticky = "news",
            )
     
            self.grid()
     
     
        def DEF_Rafraichir(self):
            def afficher( self, dirnames, filenames):
                for filename in filenames:
                    if filename[len(filename)-4:] in list_Extension:
                        list_ImagesPrep.append(filename)
                        dict_Walk[filename] = dirnames
     
            os.path.walk("I://jeux léo/textures", afficher, None)
            list_ImagesPrep.sort()
            for image in list_ImagesPrep:
                App.imagesList.insert(END, image)
     
        def clic(self, evt):
            i=App.imagesList.curselection() 
            IMAGE = App.imagesList.get(i) 
            IMAGEDirectory = dict_Walk[IMAGE] 
            image = Image.open(IMAGEDirectory + "/" + str(IMAGE)).convert("RGBA") 
            image.thumbnail((256,256), Image.ANTIALIAS)  
            photo = ImageTk.PhotoImage(image)
            messTo_TextInformation = "l'image %s se situe dans le repertoire :\n %s \n" % (IMAGE, IMAGEDirectory)
            self.TextInformation.insert(END,messTo_TextInformation) 
            self.canvasImages.create_image(256/2, 256/2, image=photo)
            self.canvasImages.grid(
                in_    = self,
                column = 1,
                row    = 2,
                columnspan = 1,
                rowspan = 1,
                sticky = "news"
            )
            self.canvasImages.erreur()
     
     
     
     
     
    if __name__=='__main__':
        App = Visualisateur_Images()
        App.master.title("Visual_I")
        App.imagesList.bind('<ButtonRelease-1>',App.clic)
        App.mainloop()

  4. #4
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut Salut ceci pourrait t'aider. . .
    Bonjour,
    Je crois que j'ai quelque chose qui peut t'aider
    excuse moi j'ai problème pour d'exécution de script je ne peux pas activer le mode code. Bon voilà, Je pense que ce qu'il te faut c'est de créer un bloc image dont tu modifiera juste l'image puis effectura un Canvas.update() bon bref ça devrait te donner un truc dans le genre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Visualisateur_Images(Frame):
        def __init__(self):
            Frame.__init__(self)
            ...
            self.can = Canvas(self,relief="solid",bd=2)
            self.poster = can.create_image(1,1)
        def actu(self,img):
            self.can.itemconfigure(self.poster,image=img)
            self.can.update()
    # Et maintenant lorsque tu as récupéré l'image et que tu l'as convertie tu appeles la méthode self.actu avec l'image en paramètre qui se charge de changer l'image de ton Canvas et de le mettre à jour.
    Salut.
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  5. #5
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    C'est sur que c'est plus propre comme cela.

    Toutefois pour commencer et ne pas trop toucher à ton code rezuz :

    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
            self.canvasImages.grid(
                in_    = self,
                column = 1,
                row    = 2,
                columnspan = 1,
                rowspan = 1,
                sticky = "news"
            )
     
            self.actuimage = self.canvasImages.create_image(256/2, 256/2) # Création de l'image vide
    ....
        def clic(self, evt):
            i=App.imagesList.curselection() 
            IMAGE = App.imagesList.get(i) 
            IMAGEDirectory = dict_Walk[IMAGE] 
            image = Image.open(IMAGEDirectory + "/" + str(IMAGE)).convert("RGBA") 
            image.thumbnail((256,256), Image.ANTIALIAS)  
            photo = ImageTk.PhotoImage(image)
            messTo_TextInformation = "l'image %s se situe dans le repertoire :\n %s \n" % (IMAGE, IMAGEDirectory)
            self.TextInformation.insert(END,messTo_TextInformation) 
            self.canvasImages.itemconfigure(self.actuimage, image=photo) # Association de self.actuimage et photo
            self.canvasImages.image = photo # On garde la référence
            self.canvasImages.update() # Update de canvasImage
    Bon code
    Merci d'utiliser le forum pour les questions techniques.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/02/2010, 08h00
  2. rafraichir graphique dans une interface swing
    Par mouss4rs dans le forum 2D
    Réponses: 4
    Dernier message: 06/06/2008, 14h51
  3. Vérification de formulaire -> Une abération !
    Par SpyesX dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 29/01/2008, 16h26
  4. Rafraichir affichage pendant une fonction
    Par E.Bzz dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 07/02/2007, 12h01
  5. Rafraichir un Canvas...
    Par alex6891 dans le forum Java ME
    Réponses: 3
    Dernier message: 03/06/2006, 22h24

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