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 :

Répétition d'un diaporama JPG utilisant PIL


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Animateur
    Inscrit en
    Novembre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Animateur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2016
    Messages : 22
    Points : 8
    Points
    8
    Par défaut Répétition d'un diaporama JPG utilisant PIL
    Bonjour à tous !

    J'ai écris le code ci dessous pour lire des photos jpg contenues dans un dossier les unes après les autres,
    Je voudrais maintenant "répéter , cycler" le tout , j'ai tenter plusieurs choses dont While mais je suis obligé de fermer la fenetre pour que le programme recommence.
    Je voudrais que les nouvelles photos qui arrivent dans le dossier soient prises en compte a chaque cycle.
    De plus ne me pose une question fondamentale : je redimensionne mes photos apres avoir lu le dossier , les photos redimensionnees se chargent en mémoire ? Pour 4 photos ca le fait mais pour 150 ?

    Est ce que quelqu'un peut m'aider à modifier mon code ?

    Merci d'avance :-)

    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
    import glob
    import os
    from Tkinter import *
    import Tkinter as Tk
    import tkFont
    import time
    from PIL import Image, ImageTk
     
     
     
     
    #creation fenetre tkinter
    fen1 = Tk.Tk()
    fen1.title('DiapoMail-SlideShow')
     
    #Chargement de toutes les images dans une liste
    print "Regarder dans le dossier de sortie et lister"
     
    listeimage = [ ]
    for s in glob.glob(os.getcwd()+"/sortie/*.jpg"):
     print s
     image = Image.open(s)
     
     ##image.resize
     baseheight = 900
     hpercent = (baseheight / float(image.size[1]))
     wsize = int((float(image.size[0]) * float(hpercent)))
     
     image=image.resize((wsize , baseheight), Image.ANTIALIAS)
     ##image.resize
     
     photo = ImageTk.PhotoImage(image)
     listeimage.append(photo)
     
    ## l'affichage se fera sur un label
    #affichage du label dans le canvas
    can1 = Canvas(fen1,bg='black',height=900,width=1950)
    item=lbl=Tk.Label(can1)
    can1.pack(side=TOP,expand=True, fill=BOTH)
    #configuration d'image pour affichage dans le canvas
     
    #increment
     
    j = 0
    ## affichage des images
    def diapo():
        global j
        ## on essaie d'afficher une image dans le canvas
        try: lbl.config(image = listeimage[j])
        except: exit ## on a passe en revu toutes les images
     
     
        j+=1
     
     
        fen1.after(2000, diapo)  ## on rappelle la fonction diapo dans 2 secondes
     
     
     
    #Boutons de commande
    bou1 = Button(fen1, text='Quitter', command = fen1.destroy)
    bou1.pack(side=LEFT, padx =0, pady =0)
    bou2 = Button(fen1, text='Moderer', command = fen1.destroy)
    bou2.pack(side=LEFT, padx =0, pady =0)
    #texte d'information dans la fenetre
    text1 = Label(fen1, text = ' salut ! :')
    text1.pack(side =TOP, padx =3, pady =3)
    text2 = Label(fen1, text = 'slide@toto.fr')
    text2.pack(side =BOTTOM, padx =3, pady =3)
    #Configuration du texte dans la fenetre
    font10 = "-family {FreeSans} -size 28 "
    text1.configure(font=font10,fg='black')
    text2.configure(font=font10,fg='red')
     
    j=0
     
     
    #demarrage
    lbl.pack()
    fen1.after(10, diapo)
    fen1.mainloop()

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

    Citation Envoyé par Alex73160 Voir le message
    Je voudrais maintenant "répéter , cycler" le tout , j'ai tenter plusieurs choses dont While mais je suis obligé de fermer la fenetre pour que le programme recommence.
    Si vous écrivez:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    def diapo():
        global j
        ## on essaie d'afficher une image dans le canvas
        try: lbl.config(image = listeimage[j])
        except: exit ## on a passe en revu toutes les images
     
     
        j+=1
        ...
    Le programme sort lorsque la valeur de "j" dépasse le nombre d'images de listeimage.
    Si vous voulez que çà recommence, il faut tester cette condition et pour recommencer mettre j à 0.

    Citation Envoyé par Alex73160 Voir le message
    Je voudrais que les nouvelles photos qui arrivent dans le dossier soient prises en compte a chaque cycle.
    Il faut essayer de traduire "nouvelles photos".
    Une idée serait d'avoir la liste des noms de fichiers images lus à l'instant t et de la comparer à la liste des fichiers images existants à l'instant t+1: la différence donnera les nouveaux fichiers.
    Puis vous avez l'association entre chacun des fichiers et son PhotoImage, qui peut être réalisée avec un "dict":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def diapo():
        global j
        nom = fichiers[j]
        lbl.config(image = dico_image[nom]
        j += 1
        if j == len(fichiers):
             ... trouver les nouvelles images....

    Citation Envoyé par Alex73160 Voir le message
    De plus ne me pose une question fondamentale : je redimensionne mes photos apres avoir lu le dossier , les photos redimensionnees se chargent en mémoire ? Pour 4 photos ca le fait mais pour 150 ?
    Ben si çà vous pose soucis, vous fabriquez le PhotoImage à partir du fichier à chaque itération...

    - W

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Animateur
    Inscrit en
    Novembre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Animateur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2016
    Messages : 22
    Points : 8
    Points
    8
    Par défaut Actualisation
    Bonjour et merci pour votre aide,
    La répétition du diaporama fonctionne,
    cependant je ne comprend pas pourquoi les nouvelles photos ne sont pas prises en compte dans l'affichage ?

    Je pense qu'il faut que je lie la fin de ma fonction lister() à la suite du programme, mais comment faire ?

    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
    import glob
    import os
    from Tkinter import *
    import Tkinter as Tk
    import tkFont
    import time
    from PIL import Image, ImageTk
     
     
     
     
    #creation fenetre tkinter
    fen1 = Tk.Tk()
    fen1.title('DiapoMail-SlideShow')
     
    #Chargement de toutes les images dans une liste
    print "Regarder dans le dossier de sortie et lister"
     
    listeimage = [ ]
    for s in glob.glob(os.getcwd()+"/sortie/*.jpg"):
     print s
     image = Image.open(s)
     
     ##image.resize
     baseheight = 900
     hpercent = (baseheight / float(image.size[1]))
     wsize = int((float(image.size[0]) * float(hpercent)))
     
     image=image.resize((wsize , baseheight), Image.ANTIALIAS)
     ##image.resize
     
     photo = ImageTk.PhotoImage(image)
     listeimage.append(photo)
     
    def lister():
           #Chargement de toutes les images dans une liste
        print "Regarder dans le dossier de sortie et lister"
     
        listeimage = [ ]
        for s in glob.glob(os.getcwd()+"/sortie/*.jpg"):
         print s
         image = Image.open(s)
     
         ##image.resize
         baseheight = 900
         hpercent = (baseheight / float(image.size[1]))
         wsize = int((float(image.size[0]) * float(hpercent)))
     
         image=image.resize((wsize , baseheight), Image.ANTIALIAS)
         ##image.resize
     
         photo = ImageTk.PhotoImage(image)
         listeimage.append(photo)
     
     
    ## l'affichage se fera sur un label
    #affichage du label dans le canvas
    can1 = Canvas(fen1,bg='black',height=900,width=1950)
    item=lbl=Tk.Label(can1)
    can1.pack(side=TOP,expand=True, fill=BOTH)
    lbl.pack()
    #configuration d'image pour affichage dans le canvas
     
    #increment
     
    j = 0
    ## affichage des images
    def diapo():
        global j
        ## on essaie d'afficher une image dans le canvas
        lbl.config(image = listeimage[j])
        #except: exit ## on a passe en revu toutes les images
     
     
        j+=1
        if j == len(listeimage):
            j=0
            #time.sleep()
            lister()
     
     
     
     
        fen1.after(2000, diapo)  ## on rappelle la fonction diapo dans 2 secondes
     
     
     
    fen1.after(20, diapo)
    #j=0
     
    #Boutons de commande
    bou1 = Button(fen1, text='Quitter', command = fen1.destroy)
    bou1.pack(side=LEFT, padx =0, pady =0)
    bou2 = Button(fen1, text='Moderer', command = fen1.destroy)
    bou2.pack(side=LEFT, padx =0, pady =0)
    #texte d'information dans la fenetre
    text1 = Label(fen1, text = 'Pour participer au diaporama par mail :')
    text1.pack(side =TOP, padx =3, pady =3)
    text2 = Label(fen1, text = 'pat@outlook.fr')
    text2.pack(side =BOTTOM, padx =3, pady =3)
    #Configuration du texte dans la fenetre
    font10 = "-family {FreeSans} -size 28 "
    text1.configure(font=font10,fg='black')
    text2.configure(font=font10,fg='red')
     
    j=0
     
     
    #demarrage
     
     
    fen1.mainloop()

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

    Réfléchissez à l'instruction que vous avez écrit ligne 39: listeimage = [ ].
    Vous vouliez vider la liste "listeimage" qui est variable globale au lieu de cela l'assignation crée une variable locale associée à liste vide.
    Pour vider la liste "globale", il faut faire del liste[:] ou liste[:] = [] ou déclarer "global listeimage"

    - W

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Animateur
    Inscrit en
    Novembre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Animateur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2016
    Messages : 22
    Points : 8
    Points
    8
    Par défaut merci
    effectivement,

    Merci beaucoup cela fonctionne !

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Animateur
    Inscrit en
    Novembre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Animateur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2016
    Messages : 22
    Points : 8
    Points
    8
    Par défaut supprimer physiquement les photos
    Je voudrais également que à la pression du bouton "modérer" je supprime physiquement l'image active à l'écran, si vous pouvez m'apporter quelques pistes ?

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    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 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Citation Envoyé par Alex73160 Voir le message
    Je voudrais également que à la pression du bouton "modérer" je supprime physiquement l'image active à l'écran, si vous pouvez m'apporter quelques pistes ?
    Plutôt que de n'avoir une liste de PhotoImage, il faut aussi avoir noms de fichiers et correspondance avec l'image affichée pour savoir lequel détruire. Mais c'est déjà ce que j'avais proposé dans mon post précédent...
    Pour supprimer "physiquement", il faut utiliser os.remove.

    - W

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Animateur
    Inscrit en
    Novembre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Animateur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2016
    Messages : 22
    Points : 8
    Points
    8
    Par défaut Photoimage à chaque itération
    Ben si çà vous pose soucis, vous fabriquez le PhotoImage à partir du fichier à chaque itération...
    Salut

    Ça m'intéresse de savoir comment ont fait, je n'y suis pas parvenu

    merci pour votre aide

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Animateur
    Inscrit en
    Novembre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Animateur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2016
    Messages : 22
    Points : 8
    Points
    8
    Par défaut Photoimage à chaque itération
    Ben si çà vous pose soucis, vous fabriquez le PhotoImage à partir du fichier à chaque itération...
    Salut

    Ça m'intéresse de savoir comment ont fait, je n'y suis pas parvenu

    merci pour votre aide

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Animateur
    Inscrit en
    Novembre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Animateur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2016
    Messages : 22
    Points : 8
    Points
    8
    Par défaut Configuration dico_image
    Bonjour,

    J'avoue que je tourne un peut en rond, mon expérience Python reste limitée, voila ou j'en suis :

    J'aimerai arriver à utiliser le dico_image (pour la suppression future)

    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
    import glob
    import os
    from Tkinter import *
    import Tkinter as Tk
    import tkFont
    import time
    from PIL import Image, ImageTk
     
     
     
     
    #creation fenetre tkinter
    fen1 = Tk.Tk()
    fen1.title('DiapoMail-SlideShow')
     
    #Chargement de toutes les images dans une liste
    print "Regarder dans le dossier de sortie et lister"
     
    fichiers = [ ]
    for s in glob.glob(os.getcwd()+"/sortie/*.jpg"):
     print s
     image = Image.open(s)
     
     ##image.resize
     baseheight = 900
     hpercent = (baseheight / float(image.size[1]))
     wsize = int((float(image.size[0]) * float(hpercent)))
     
     image=image.resize((wsize , baseheight), Image.ANTIALIAS)
     ##image.resize
     
     photo = ImageTk.PhotoImage(image)
     fichiers.append(photo)
     
    def lister():
           #Chargement de toutes les images dans une liste
        print "Regarder dans le dossier de sortie et lister"
        del fichiers[:-1]
        #listeimage = []
        for s in glob.glob(os.getcwd()+"/sortie/*.jpg"):
         print s
         image = Image.open(s)
     
         ##image.resize
         baseheight = 900
         hpercent = (baseheight / float(image.size[1]))
         wsize = int((float(image.size[0]) * float(hpercent)))
     
         image=image.resize((wsize , baseheight), Image.ANTIALIAS)
         ##image.resize
     
         photo = ImageTk.PhotoImage(image)
         fichiers.append(photo)
     
     
     
    ## l'affichage se fera sur un label
    #affichage du label dans le canvas
    can1 = Canvas(fen1,bg='black',height=900,width=1950)
    item=lbl=Tk.Label(can1)
    can1.pack(side=TOP,expand=True, fill=BOTH)
    lbl.pack()
    #configuration d'image pour affichage dans le canvas
     
    #increment
     
    j = 0
    ## affichage des images
    def diapo():
        global j
        nom = fichiers[j]
        ## on essaie d'afficher une image dans le canvas
        dico_image=dict(s)
        lbl.config(image = dico_image[nom])
        #except: exit ## on a passe en revu toutes les images
     
     
        j+=1
        if j == len(fichiers):
            j=0
            #time.sleep()
            lister()
     
     
     
     
        fen1.after(2000, diapo)  ## on rappelle la fonction diapo dans 2 secondes
     
     
     
    fen1.after(100, diapo)
    #j=0
     
    #Boutons de commande
    bou1 = Button(fen1, text='Quitter', command = fen1.destroy)
    bou1.pack(side=LEFT, padx =0, pady =0)
    bou2 = Button(fen1, text='Moderer', command = fen1.destroy)
    bou2.pack(side=LEFT, padx =0, pady =0)
    #texte d'information dans la fenetre
    text1 = Label(fen1, text = 'Pour participer au diaporama, envoi ton SELFIE avec ton SMARTPHONE par mail :')
    text1.pack(side =TOP, padx =3, pady =3)
    text2 = Label(fen1, text = 'gege@outlook.fr')
    text2.pack(side =BOTTOM, padx =3, pady =3)
    #Configuration du texte dans la fenetre
    font10 = "-family {FreeSans} -size 28 "
    text1.configure(font=font10,fg='black')
    text2.configure(font=font10,fg='red')
     
    j=0
     
     
    #demarrage
     
     
    fen1.mainloop()

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Animateur
    Inscrit en
    Novembre 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Animateur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2016
    Messages : 22
    Points : 8
    Points
    8
    Par défaut Redimensionnement à chaque itération
    Pour le redimensionnement à chaque itération, j'ai retourner le code dans tous les sens , je n'y suis pas arrivé,

    merci infiniment pour l'aide que vous m'apporterez, ce projet me tiens énormément à coeur.

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/07/2008, 13h30
  2. Quelle technologie web utiliser pour réaliser un diaporama en 3D ?
    Par yonat94 dans le forum Général Conception Web
    Réponses: 4
    Dernier message: 24/05/2007, 15h40
  3. [Pil] Utilisation de matrice de convertion
    Par airod dans le forum Calcul scientifique
    Réponses: 8
    Dernier message: 10/05/2006, 23h30
  4. [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, 17h46
  5. [Pil] utilisation de getpixel
    Par duplo dans le forum Tkinter
    Réponses: 7
    Dernier message: 20/12/2005, 20h01

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