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 :

Tkinter : comment afficher "automatiquement" des images avec une fonction récurrente


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2018
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Tkinter : comment afficher "automatiquement" des images avec une fonction récurrente
    Bonjour à tou(te)s les expert(e)s.
    Avec Tkinter, j'aimerais afficher successivement et sans intervention après appui sur un bouton de commande une image que j'ai modifié par une fonction récurrente jusqu'à que cette image soit identique à l'image originale (fonction bijective "photomaton").

    Le programme que j'ai actuellement affiche ces différentes images si on appuie sur le bouton "Photomaton" mais j'aimerais "automatisé" le processus et qu'il s'arrête quand l'image créée est identique à l'image originale.
    J'ai essayé avec les 2 lignes code mis en commentaire dans la fonction mais le programme boucle et n'affiche plus rien ........

    Merci d'avance.
    (je vous fourni l'image 256x256 utilisée)

    Claude
    Nom : chalet.png
Affichages : 823
Taille : 105,8 Ko
    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
    from tkinter import *
     
    from PIL import Image
     
    import os
     
     
    def photomaton() :
        global img
        global img0
        imgf=Image.new('RGB',dim)
        for i in range(dim[0]):
            for j in range(dim[1]):
                if i%2==0 and j%2==0:
                    imgf.putpixel((i//2,j//2),img.getpixel((i,j)))
                if i%2==1 and j%2==0:
                    imgf.putpixel((i//2+dim[0]//2,j//2),img.getpixel((i,j)))
                if i%2==0 and j%2==1:
                    imgf.putpixel((i//2,j//2+dim[1]//2),img.getpixel((i,j)))
                else :
                    imgf.putpixel((i//2+dim[0]//2,j//2+dim[1]//2),img.getpixel((i,j)))
        img=imgf
        imgf.save("tempo.png")
        imagetraitee=PhotoImage(file="tempo.png")
        canvas.create_image(0, 256, anchor=NW,image=imagetraitee)
        canvas.pack()
     
    ##    if img!=img0 :
    ##        photomaton()
     
        canvas.mainloop()
     
     
     
     
    # image d'origine img0 et création de la nouvelle image newimg
    img0=Image.open("chalet.png")
    dim=img0.size
    newimg=Image.new('RGB',dim)
    newimg.save("tempo.png")        #image tempo créée "pour rien" pour éviter erreur car tempo inexistant si Quitter directement
    img=img0
     
     
    # fenetre et boutons
    fenetre = Tk()
    imgTK0= PhotoImage(file="chalet.png")
    canvas = Canvas(fenetre,width=600, height=500)
     
    canvas.create_image(0, 0, anchor=NW,image=imgTK0)
    canvas.pack()
     
    titre = Label(fenetre, text="Traitement d'image minimaliste ....",foreground="red",background="yellow")
    titre.pack()
     
    bou1 = Button(fenetre,text='Quitter',command=fenetre.destroy) #Bouton Quitter
    bou1.place(relx=1, rely=1, anchor=SE)
     
    bou5 = Button(fenetre,text='Photomaton',command=photomaton) #Bouton "photomaton"
    bou5.place(relx=0.8, rely=0.5, anchor="c")
     
    fenetre.mainloop()
     
     
    os.remove("tempo.png")      #suppression fichier temporaire

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Salut,

    Avec tkinter, répéter une activité peut se faire avec ".after".
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import tkinter as tk
     
    def do_display(n, delay=200):
        label.configure(text=n)
        if n > 0:
            label.after(delay, do_display, n-1)
     
    root = tk.Tk()
    label = tk.Label(root, text='')
    label.pack()
    do_display(5)
    root.mainloop()
    Après, il faut peut être revoir votre condition d'arrêt car vos objets PhotoImage étant différents, comparer le contenu (ou autre) pour faire fonctionner l'égalité ne va pas se faire tout seul.

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

  3. #3
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2018
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci pour votre réponse mais je ne vois pas comment mettre en œuvre votre solution possible.

    J'ai résolu (de façon très lourdingue...) la condition d'arrêt mais je n'arrive pas à trouver comment afficher automatiquement mes images successives ...
    Mon programme actuel (un peu "amélioré") permet de voir toutes les images mais il faut cliquer sur le bouton a chaque fois donc il ne "boucle" pas :
    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
    from tkinter import *
     
    from PIL import Image
     
    import os
     
    def photomaton() :
        global img
        global n
     
        imgf=Image.new('RGB',dim)
     
        if img!=img0 or n==0 :  #les 2 images sont du même type donc je peux les comparer
            for i in range(dim[0]):
                for j in range(dim[1]):
     
                    if i%2==0 and j%2==0:
                        imgf.putpixel((i//2,j//2),img.getpixel((i,j)))
                    if i%2==1 and j%2==0:
                        imgf.putpixel((i//2+dim[0]//2,j//2),img.getpixel((i,j)))
                    if i%2==0 and j%2==1:
                        imgf.putpixel((i//2,j//2+dim[1]//2),img.getpixel((i,j)))
                    else :
                        imgf.putpixel((i//2+dim[0]//2,j//2+dim[1]//2),img.getpixel((i,j)))
            img=imgf
            n=n+1
        else :
            n=0
            photomaton()
     
        imgf.save("tempo.png")
        imagetraitee=PhotoImage(file="tempo.png")
        canvas.create_image(0, 256, anchor=NW,image=imagetraitee)
        canvas.pack()
        canvas.mainloop()
     
     
     
    # image d'origine img0 et création de la nouvelle image newimg
    imgOrigine=Image.open("chalet.png")
     
    dim=imgOrigine.size
    img0=Image.new('RGB',dim)   #Astuce lourdingue pour modifier le type de l'image PngImageFile en Image
    for m in range (dim[0]) :
        for n in range(dim[1]) :
            img0.putpixel((m,n),imgOrigine.getpixel((m,n)))
     
    newimg=Image.new('RGB',dim)
    newimg.save("tempo.png")        #image tempo créée "pour rien" pour éviter erreur car tempo inexistant si Quitter directement
    img=img0
     
     
     
    n=0
     
    # fenetre et boutons
    fenetre = Tk()
    imgTK0= PhotoImage(file="chalet.png")
    canvas = Canvas(fenetre,width=600, height=500)
     
    canvas.create_image(0, 0, anchor=NW,image=imgTK0)
    canvas.pack()
     
    titre = Label(fenetre, text="Traitement d'image minimaliste ....",foreground="red",background="yellow")
    titre.pack()
     
    bou1 = Button(fenetre,text='Quitter',command=fenetre.destroy) #Bouton Quitter
    bou1.place(relx=1, rely=1, anchor=SE)
     
    bou5 = Button(fenetre,text='Photomaton',command=photomaton) #Bouton "photomaton"
    bou5.place(relx=0.8, rely=0.5, anchor="c")
     
    fenetre.mainloop()
     
     
    os.remove("tempo.png")      #suppression fichier temporaire
    Si je remplace les lignes 27 à 35, par les lignes suivantes, le programme boucle, s’arrête au bon moment (la condition d’arrêt fonctionne) MAIS les images intermédiaires ne s'affichent pas (j'ai vérifié et elles sont bien formées) ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            imgf.save("tempo.png")
            imagetraitee=PhotoImage(file="tempo.png")
     
            canvas.create_image(0, 256, anchor=NW,image=imagetraitee)
            canvas.pack()
            photomaton()
            fenetre.mainloop()
        else :
            n=0
     
        fenetre.mainloop()
    Bref, c'est encore un peu confus ....

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Citation Envoyé par cv031 Voir le message
    Merci pour votre réponse mais je ne vois pas comment mettre en œuvre votre solution possible.
    Il faut essayer de comprendre comment çà fonctionne.

    Citation Envoyé par cv031 Voir le message
    J'ai résolu (de façon très lourdingue...) la condition d'arrêt mais je n'arrive pas à trouver comment afficher automatiquement mes images successives ...
    A part .after (voir mon exemple) et .update_XXX, vos options sont assez limitées.
    Donc soit vous êtes un génie et vous allez trouver une solution originale, soit vous faites comme tout un chacun et vous commencez par apprendre à utiliser les solutions qui ont été construites pour faire ce genre de chose.
    Il n'y a rien à chercher, rien à trouver: juste apprendre à utiliser tkinter.

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

Discussions similaires

  1. afficher des images avec une fonction
    Par wilfried_42 dans le forum Contribuez
    Réponses: 0
    Dernier message: 16/09/2008, 20h03
  2. Réponses: 3
    Dernier message: 15/11/2005, 18h50
  3. Gestion des chemins des images avec une base de données...
    Par Nean dans le forum Bases de données
    Réponses: 4
    Dernier message: 27/07/2005, 08h08

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