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 :

[Demande d'aide débutant] Diaporama avec Tkinter, 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 [Demande d'aide débutant] Diaporama avec Tkinter, PIL
    Bonjour,

    Cela fait plusieurs semaines que je tourne en rond sur 3 fonctions, vous allez peut être pouvoir m'aider:

    1: Dans le code ci-dessous je voudrais redimensionner mes images pour qu'elles rentrent à tous les coups dans le canvas en hauteur (et que la largeur se redimensionne proportionnellement) j'ai trouver la fonction à intégrer juste après image.open(s) seulement je voudrais redimensionner après "photoimage" à chaque itération du compteur ce qui aurai pour effet de ne redimensionner qu'une image à chaque fois.

    2: Je cherche à définir le bouton "Modérer" qui permettrai de vider le canvas et de supprimer l'image affichée "physiquement"

    3: Je voudrais récupérer les données EXIF de l'image à chaque itération pour qu'elle s'affiche "droite" à tous les coups (car les images vont provenir de téléphones portables dans le cadre d'une animation)

    Je cherche les codes et méthodes qui permettent d'arriver à ces résultats
    Merci d'avance pour votre aide !

    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
    mport glob
    import os
    from Tkinter import *
    import Tkinter as Tk
    import tkFont
    import time
    from PIL import Image, ImageTk, ExifTags
     
     
    #creation fenetre tkinter
    fen1 = Tk.Tk()
    fen1.title('DiapoMail-SlideShow')
     
     
    #Chargement de toutes les images dans une liste pour la premiere fois
    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)
     
     
     
     photo = ImageTk.PhotoImage(image)
     
     listeimage.append(photo)
     
     
    def lister():
        #Chargement de toutes les images dans une liste pour toutes les autres fois
        print "Regarder dans le dossier de sortie et lister"
        del listeimage[:]
        #listeimage = []
        for s in glob.glob(os.getcwd()+"/sortie/*.jpg"):
         print s
         image = Image.open(s)
     
         photo = ImageTk.PhotoImage(image)
     
     
         listeimage.append(photo)
     
     
     
    ## l'affichage se fera sur un canvas
     
    can1 = Tk.Canvas(fen1,bg='black',height=900,width=1950)
     
    can1.pack(side=TOP,expand=True, fill=BOTH)
     
     
     
    #increment
     
    j = 0
    ## affichage des images
    def diapo():
     
        can1.delete(ALL) #on efface le canvas
        global j
     
        ## on essaie d'afficher une image dans le canvas
     
        item=can1.create_image(975,450, anchor ='center', 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(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 = can1.delete(ALL))
    bou2.pack(side=LEFT, padx =0, pady =0)
    #texte d'information dans la fenetre
    text1 = Label(fen1, text = 'Pour participer au diaporama:')
    text1.pack(side =TOP, padx =3, pady =3)
    text2 = Label(fen1, text = 'pa@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()

  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 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Alex73160 Voir le message
    1: Dans le code ci-dessous je voudrais redimensionner mes images pour qu'elles rentrent à tous les coups dans le canvas en hauteur (et que la largeur se redimensionne proportionnellement) j'ai trouver la fonction à intégrer juste après image.open(s) seulement je voudrais redimensionner après "photoimage" à chaque itération du compteur ce qui aurai pour effet de ne redimensionner qu'une image à chaque fois.
    L'objet retourné par PhotoImage n'a pas de méthode .resize ou équivalent. Il va falloir faire avec.

    Citation Envoyé par Alex73160 Voir le message
    2: Je cherche à définir le bouton "Modérer" qui permettrai de vider le canvas et de supprimer l'image affichée "physiquement"
    os.remove(nom_du_fichier) où nom du fichier sort d'une liste de fichiers cohérente avec listeimage?
    Il y a plein d'autres solutions avec des listes, des dictionnaires. Ce sont des structures de bases, difficile de coder sans les connaître.

    Citation Envoyé par Alex73160 Voir le message
    3: Je voudrais récupérer les données EXIF de l'image à chaque itération pour qu'elle s'affiche "droite" à tous les coups (car les images vont provenir de téléphones portables dans le cadre d'une animation)
    Pourquoi ne pas faire un peu de recherche avec Google pour trouver comment faire çà avec PIL?

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

  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 Append
    Salut, merci je vais continuer à bosser,

    Mon premier souci c'est que mes images redimensionnees sont stockées en mémoire vive du coup ? 1go de mémoire sur raspberry pi 3 c'est juste.

    Le deuxième c'est que mon diaporama se fige quand les fichiers se chargent et se redimensionnent.

    Le 3ème c'est que je ne suis pas bien sur de comprendre la fonction de listeimage.append(photo)

  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 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Alex73160 Voir le message
    Mon premier souci c'est que mes images redimensionnees sont stockées en mémoire vive du coup ? 1go de mémoire sur raspberry pi 3 c'est juste.
    Vous avez besoin de stocker en mémoire que les images affichées et peut être quelques unes qui seront affichées pour autant que çà apporte de la fluidité.

    Citation Envoyé par Alex73160 Voir le message
    Le deuxième c'est que mon diaporama se fige quand les fichiers se chargent et se redimensionnent.
    Si vous rechargez toutes les images, çà prendra du temps et comme cette opération travaille dans le même thread que le GUI, l'affichage se bloque.

    Citation Envoyé par Alex73160 Voir le message
    Le 3ème c'est que je ne suis pas bien sur de comprendre la fonction de listeimage.append(photo)
    Listes et dictionnaires sont des structures de base du langage. On apprend à les maîtriser en passant un peu de temps dans n'importe quel tuto.. Toutes les améliorations de (votre) code qu'on pourra proposer seront basées la dessus. Si vous ne connaissez pas ces structures de données, çà ne sert à rien de vous suggérer quoi que ce soit (à part écrire le code à votre place).

    A vous de voir.

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

  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
    Re

    J'ai bel et bien toutes les clés en main, append veut dire "ajouter"
    Il existe peut être une autre librairie que PIL pour lire les JPG avec une autre méthode plus souple que Photoimage ?
    Et la gestion de liste n'est pas un probleme.

    Il faut juste que je sépare ma partie programme de ma partie graphique en créant un thread, c'est la solution pour eviter que mon diaporama se fige...

    J'ai cru comprendre qu'il était possible de fabriquer le Photoimage et de le redimensionner à chaque itération ?
    Pour le coup si vous avez la solution toute faite avec les explications pour que je comprenne ca m'intéresse vivement!

  6. #6
    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 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Alex73160 Voir le message
    J'ai cru comprendre qu'il était possible de fabriquer le Photoimage et de le redimensionner à chaque itération ?
    Pour le coup si vous avez la solution toute faite avec les explications pour que je comprenne ca m'intéresse vivement!
    Fabriquer une liste de PhotoImage et piocher dedans plutôt que piocher dans une liste de noms de fichiers pour fabriquer un PhotoImage, c'est organiser de mêmes opérations (un peu) différemment.
    La seule difficulté étant déjà traitée dans la FAQ Tkinter.

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

  7. #7
    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 Memoire
    Salut,

    Alors du coup pour résoudre le problème de mémoire, je charge que 5 photos de façon aléatoire à chaque fois avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for s in random.sample(glob.glob(os.getcwd()+"/sortie/*.jpg"),5):
     
         print s
     
     
         image = Image.open(s)
    cependant je suis obligé d'avoir 5 photos à chaque fois ! je voudrais charger 5 maximum, <= ne fonctionne pas

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/12/2016, 17h22
  2. Demande d'aide sur vba avec excel
    Par karter13 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/01/2016, 21h56
  3. demande d'aide pour démarrer avec linux
    Par casper29 dans le forum Réseau
    Réponses: 4
    Dernier message: 24/05/2009, 20h42

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