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 :

fonction: Diaporama Publicitaire


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2013
    Messages : 26
    Points : 11
    Points
    11
    Par défaut fonction: Diaporama Publicitaire
    Bonjour,

    Je suis toujours en pleine expérimentation pour faire un diaporama. J'avais déjà ouvert un poste à ce sujet (https://www.developpez.net/forums/d1...itaire-django/) car je voulais faire avec Django. J'ai décider de changer et orienté sur une interface graphique. J'ai trouvé ce poste concernant un diaporama (https://www.developpez.net/forums/d9...ire-diaporama/). J'ai récris de cette manière le bout de 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
    from tkinter import *
    from glob import glob
    from PIL import Image, ImageTk
    #import pdb ; pdb.set_trace()
     
    j = 0
    window = Tk()
    lbl = Label(window)
    lbl.pack()
     
    slides = []
    for i in glob('./slides/*.JPG'):
        image = Image.open(i)
        photo = ImageTk.PhotoImage(image)
        slides.append(photo)
     
    def slideshow():
        global j
        if j == len(slides):
            j = 0
        try:
            lbl.config(image = slides[j])
            j += 1
        except:
            exit
        window.after(2000, slideshow)
     
    slideshow()
    window.mainloop()
    La ça fonctionne mais je voudrais mettre la partie de chargement des photos dans une fonction. Voici ma modification:
    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
    from tkinter import *
    from glob import glob
    from PIL import Image, ImageTk
    #import pdb ; pdb.set_trace()
     
    j = 0
    window = Tk()
    lbl = Label(window)
    lbl.pack()
     
    def loadSlides():
        slides = []
        for i in glob('./slides/*.JPG'):
            image = Image.open(i)
            photo = ImageTk.PhotoImage(image)
            slides.append(photo)
        return slides
     
    def slideshow():
        slides = loadSlides()
        global j
        if j == len(slides):
            j = 0
        try:
            lbl.config(image = slides[j])
            j += 1
        except:
            exit
        window.after(2000, slideshow)
     
    slideshow()
    window.mainloop()
    Maintenant j'ai plus que la fenêtre tkinter qui s'ouvre mais je n'ai pas d'image qui s'affiche. Quand je fais avec pdb, dans ma variable slides de la fonction slideshow, j'ai les images et quand j'arrive sur lbl.conf, je peux charger l'image dans la fenêtre. Mais il se bloque après sur windows.after. Pourquoi? Et il y a aussi quelqu'un qui arrive me dire pourquoi dans window.after, l'appel de la fonction et sans les parentaise?

    Merci pour vos réponses

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

    C'est super de ré-utiliser le code qu'on trouve sur Internet... mais sauf à pouvoir l'utiliser tel que, sans comprendre comment il fonctionne pas facile de le modifier.

    Citation Envoyé par xekkos Voir le message
    Maintenant j'ai plus que la fenêtre tkinter qui s'ouvre mais je n'ai pas d'image qui s'affiche. Quand je fais avec pdb, dans ma variable slides de la fonction slideshow, j'ai les images et quand j'arrive sur lbl.conf, je peux charger l'image dans la fenêtre.
    C'est dans la FAQ...
    La FAQ permet de ré-utiliser les réponses données à des questions posées moulte fois par des débutants déconcertés.

    Citation Envoyé par xekkos Voir le message
    Mais il se bloque après sur windows.after. Pourquoi? Et il y a aussi quelqu'un qui arrive me dire pourquoi dans window.after, l'appel de la fonction et sans les parentaise?
    Il faut commencer par savoir ce que fait .after ce qui est dans
    n'importe quelle documentation.
    note: la documentation est aussi ré-utilisable à souhait.

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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2013
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Merci pour m'avoir répondu.

    C'est pas facile de ce documenter sur internet et il faut trouver les bouts sites pour travailler! Je comprends maintenant qu'on trouve beaucoup réponse sur ce site mais je ne sais pas forcement l'utiliser car je trouve qu'on est noyé sous la quantité d'information et de liens internes. Je ne savais pas que la FAQ était aussi bien faite, je vais maintenant pouvoir l'utiliser. Merci aussi pour la documentation sur tinker, j'utilisais celle de http://effbot.org/ bien mais en Anglais. Là, je vais bien pouvoir mieux comprendre.

    Encore merci et mes meilleures salutations

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Citation Envoyé par xekkos Voir le message
    Je ne savais pas que la FAQ était aussi bien faite, je vais maintenant pouvoir l'utiliser. Merci aussi pour la documentation sur tinker, j'utilisais celle de http://effbot.org/ bien mais en Anglais. Là, je vais bien pouvoir mieux comprendre.
    C'est pour cela que je préfère vous donner l'occasion de les découvrir plutôt que de vous donner directement des réponses.

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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2013
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Oui, c'est mieux pour moi!! Je vais pouvoir travailler dessus cet après midi. Le jour, ou j'ai fini de coder mon premier projet en python, je peux poster ici pour avoir des critiques? J'ai fait ça quand j'ai appris la programmation shell et j'ai pu vite progresser.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Citation Envoyé par xekkos Voir le message
    Oui, c'est mieux pour moi!! Je vais pouvoir travailler dessus cet après midi. Le jour, ou j'ai fini de coder mon premier projet en python, je peux poster ici pour avoir des critiques? J'ai fait ça quand j'ai appris la programmation shell et j'ai pu vite progresser.
    pas de problème.

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

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2013
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Comme j'ai écris plus haut, je viens montrer le bout de code que j'ai écris. Il est fonctionnel mais très certainement perfectible! C'est avec plaisir que je prends critiques et conseils pour améliorer mon code. Il faudra que je l'optimise, car il y a des parties que je n'utilise plus.

    Je résume le but de mon futur projet et programme: J'aimerais faire un diaporama publicitaire modifiable rapidement et facilement. Je pensais le faire tourner sur un Banana Pi (Le raspbery pi chinois) branché sur une TV. L'idée est de pouvoir modifier à distance le diaporama en ajoutant des slides et leurs temps de pose.

    Actuellement, j'ai juste codé la partie affichage. Au début, j'ai utilisé un fichier pour stocker l'emplacement des slides et leurs de temps de pose. Une fois que cette partie fonctionnait, j'ai essayé de remplacé par une table SQL. Voici le code complet:
    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
    from tkinter import *
    import os, sqlite3
    from PIL import Image, ImageTk
    import pdb
     
    def loadConfig():
        with open('./slides/slides.txt', 'r') as configFile:
            x = 0
            delay = []
            link = []
            for line in configFile.readlines():
                c = 0
                flag = False
                val_delay = ''
                val_link = ''
                for char in line:
                    # Lignes de commentaires < # >
                    if char == '#':
                        brk = True
                        break
                    # Séparation et compteur de champs supportant plusieurs espaces
                    if flag and char != ' ':
                        c += 1
                        flag = False
                    if char == ' ':
                        flag = True
                        continue
                    # Retour à la ligne
                    if char == '\n':
                        break
                    # Champ 1: délai
                    if c == 0:
                        val_delay += char
                    # Champ 2: lien de la photo
                    if c == 1:
                        val_link += char
                if brk:
                    brk = False
                    continue
                delay.append(val_delay)
                link.append(val_link)
                x += 1
        return delay, link
     
    def sql():
        conn_db = sqlite3.connect('./slides/slides.db')
        with conn_db:
            cursor = conn_db.cursor()
            cursor.execute('SELECT * FROM slides')
            return cursor.fetchall()
     
    def loadSlides(links):
        slides = []
        for link in links:
            slide_open = Image.open('./'+link)
            slide = ImageTk.PhotoImage(slide_open)
            slides.append(slide)
        return slides
     
    def slideshow():
        #pdb.set_trace()
        global j
        j += 1
        if j == len(slides):
            j = 0
        delay[j]
        try:
            lbl.config(image = slides[j])
        except:
            exit
        window.after(delay[j], slideshow)
     
    if __name__ == '__main__':
        j = -1
        window = Tk()
        window.attributes("-fullscreen", True)
        lbl = Label(window)
        lbl.pack()
     
        #delay, links = loadConfig()
     
        delay = []
        for slide in sql():
            delay.append(slide[1])
     
        links = []
        for slide in sql():
            links.append(slide[2])
     
        slides = loadSlides(links)
     
        slideshow()
        window.mainloop()
    Maintenant, je suis entrain de réfléchir sur la partie qui remplit la table et télécharge les images sur le BPi. Idealement, j'aimerais faire depuis une plate-forme web, pour éviter l'utilisateur final de devoir posséder un programme annexe. J'avais comme idée soit d'utiliser Django ou soit d'intégrer un serveur web à mon programme. Pour les 2 solutions faudra que j'apprenne pour créer le code. Quelqu'un aurait une autre idée?

    Voilà. je vous ai mieux présenté mon projet, pensez-vous que je suis dans la bonne direction ou que je devrais voir mon projet sous un autre angle? Et svp, plein de critique sur mon code, j'aimerais apprendre à programmer de manière propre et correcte.

    Merci pour tous

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

    Citation Envoyé par xekkos Voir le message
    Comme j'ai écris plus haut, je viens montrer le bout de code que j'ai écris. Il est fonctionnel mais très certainement perfectible! C'est avec plaisir que je prends critiques et conseils pour améliorer mon code.
    ligne 11 : quelle fatigue pour décomposer deux champs séparés par un blanc dans une ligne! Vous n'avez pas trop regardé ce qu'on peut faire avec les chaînes de caractères en Python et vous ignorez les fonctionnalités de base qui sont là pour vous simplifier la vie.

    Prenez le temps de potasser un tuto.

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

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2013
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Bonjour,
    Merci pour la réponse. Alors pour répondre, oui j'ai suivi plusieurs tutos. Et je suis peux être déjà passer sur la solution plus simple. Personnellement, enfin malheureusement, je n'ai pas une mémoire eidétique. Si je suis bon dans d'autre domaine, malheureusement la programmation mais surtout l'algorithmique, j'ai plus de peine. Je dois malheureusement m'entraîner beaucoup pour que ça rentre, nous ne sommes pas tous pareils. L'adage dit que c'est en forgeant qu'on devient forgeron! Alors je forge et je constate que je commence à mieux cerner comment faire les chose que j'aimerais. À défaut de rester sur des problèmes, je me suis mis coder des choses fonctionnelles et après je cherche à améliorer car oui je sais que mon code est perfectible. Je suis autodidacte et je suis habitué à apprendre seul dans mon coin. Histoire de gagner du temps, on m'a conseillé d'utiliser les forums dont celui-ci qui sont fait pour l'entraide. D'ailleurs j'avais eu de bon retour quand j'avais débuté en Shell. Mais je comprends que je n'ai pas le niveau, ici, pour poser des questions intelligentes qui méritent des réponses intelligentes donc je vais retourner potasser seul mes livres et tutos afin de répondre seul à mes questions. Et peut être que je gagnerais plus de temps que de pousser mon coup de gueule.
    Merci quand même d'avoir pris le temps de me lire et de me répondre.
    Salutation

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Citation Envoyé par xekkos Voir le message
    Histoire de gagner du temps, on m'a conseillé d'utiliser les forums dont celui-ci qui sont fait pour l'entraide.
    Quand vous écrivez:
    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
        with open('./slides/slides.txt', 'r') as configFile:
            x = 0
            delay = []
            link = []
            for line in configFile.readlines():
                c = 0
                flag = False
                val_delay = ''
                val_link = ''
                for char in line:
                    # Lignes de commentaires < # >
                    if char == '#':
                        brk = True
                        break
                    # Séparation et compteur de champs supportant plusieurs espaces
                    if flag and char != ' ':
                        c += 1
                        flag = False
                    if char == ' ':
                        flag = True
                        continue
                    # Retour à la ligne
                    if char == '\n':
                        break
                    # Champ 1: délai
                    if c == 0:
                        val_delay += char
                    # Champ 2: lien de la photo
                    if c == 1:
                        val_link += char
                if brk:
                    brk = False
                    continue
                delay.append(val_delay)
                link.append(val_link)
                x += 1
        return delay, link
    qui pourrait s'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        delay = []
        link = []
        with open('./slides/slides.txt', 'r') as configFile:
            for line in configFile.read().splitlines():
                if '#' in line:
                    continue
                vd, vl = line.split(' ')
                delay.append(vd)
                link.append(vl)
        return delay, link
    il m'est difficile de dire autre chose que:
    ligne 11 : quelle fatigue pour décomposer deux champs séparés par un blanc dans une ligne! Vous n'avez pas trop regardé ce qu'on peut faire avec les chaînes de caractères en Python et vous ignorez les fonctionnalités de base qui sont là pour vous simplifier la vie.
    Pas besoin de mémoire photographique pour se dire "je fais un traitement sur des chaînes de caractères, plutôt que de me lancer à coder comme un fou jusqu’à ce que çà tombe en marche, allons regarder quelles sont les méthodes que je pourrais utiliser"...

    A défaut d'aller (re)lire la documentation, si vous avez lu X tuto, vous devriez avoir dans un coin un stock de scripts d'exemples de traitements dans lesquels puiser (c'est plus facile d'aller recopier des exemples trouvés dans les forums mais si vous ne faites pas les exos d'un tuto. en vous prenant un peu le chou pour arriver à l'écrire par vous même, vous n'apprendrez pas et vous n'aurez pas votre stock d'exemples).
    Les chaînes de caractères sont un des types de bases de Python, tous les tutos vont vous en parler et vous faire utiliser les méthodes les plus courantes.

    La programmation est un exercice de compréhension. Un forum d'entre-aide, c'est bien pour essayer d'expliquer des concepts mal compris (lorsqu'on essaie de faire l'exo d'un tuto ou quand on essaie d'utiliser une bibliothèque), pas pour remettre à plus tard un apprentissage nécessaire (et une partie de cette entre-aide est de mettre de bons tutos à disposition).

    L'entraide, c'est pour que vous deveniez meilleur, pas pour écrire le code (et lire la documentation) à votre place.

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

  11. #11
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2013
    Messages : 26
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Merci de m'avoir quand même répondu! C'est vrais que j'aurais du commencer par faire des meilleurs tutos! Je constate que ceux présenté ici sont beaucoup mieux que les autres que j'ai fait sur le net! J'ai peut être pas eu la meilleure approche pour apprendre la programmation. Je fonctionne plus par rétro-ingénierie. Mais maintenant, j'ai le temps et l'envie pour progresser en python et corriger mes erreurs! Je vais bien analyser ce bout de code avec splitlines(). Il m'aurait fallu beaucoup de temps à trouver cette approche car je pensais que mon approche était bien (mais je comprends qu'elle est peu optimisée). J'ai vraiment du mal à penser orientés objets car si j'ai bien compris c'est une approche poo alors que moi je suis plus impératif? Je tâcherais de réfléchir à 2x (voir a 10x) et de penser objet avant de revenir poster des questions peu réfléchie.

    Salutation

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Citation Envoyé par xekkos Voir le message
    J'ai vraiment du mal à penser orientés objets car si j'ai bien compris c'est une approche poo alors que moi je suis plus impératif? Je tâcherais de réfléchir à 2x (voir a 10x) et de penser objet avant de revenir poster des questions peu réfléchie
    Pourquoi réfléchir 10xfois avant d'ouvrir le chapitre (ou la documentation) de son tuto. qui récapitule les méthodes des chaînes de caractères?

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

Discussions similaires

  1. [Python 3.X] Diaporama Publicitaire avec Django
    Par xekkos dans le forum Django
    Réponses: 4
    Dernier message: 21/02/2017, 14h29
  2. Réponses: 2
    Dernier message: 06/01/2014, 07h53
  3. Réponses: 12
    Dernier message: 17/02/2010, 16h59
  4. [Forum] Script diaporama photo avec fonction "glob"
    Par marc.suisse dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 18/03/2009, 13h02
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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