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

GUI Python Discussion :

affichage d'images successivement dans le même canvas sans freeze de l'interface


Sujet :

GUI Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2021
    Messages : 38
    Par défaut affichage d'images successivement dans le même canvas sans freeze de l'interface
    Bonjour,

    Ci-dessous l'exemple simple en question :

    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
     
     
    from tkinter import *
    from time import *
    var = 30
     
    path = "C:\\XX\\XY\\XXY\\Y\\"
     
    def change_img():
        tab_img = [f"{path}image1.gif",f"{path}image2.gif"] # images en 90x90
        for i in tab_img:
            photo = PhotoImage(file = i)
            canvas_logo.create_image(wi/2, he/2 ,image=photo)  
            canvas_logo.itemconfigure('image', image=photo)
            canvas_logo.update()
            sleep(1)
        win.after(1000, change_img)
     
     
    win = Tk()
     
     
    win.geometry("1000x720")
    win.config(background='#7720B9')
     
     
     
     
    def ajout_():
        global var
        canvas1 = Canvas(win, width= 200, height= 50)
        canvas1.create_rectangle(0, 0, 200, 50, fill="red")
     
     
        canvas2 = Canvas(win, width= 200, height= 50)
        canvas2.create_rectangle(0, 0, 200, 50, fill="yellow")
        canvas1.place(x=0, y=var)
        canvas2.place(x=200, y=var)
     
        myentry1 = Entry(canvas1, bd = 3)
        myentry1.place(x = 5, y = 12.5)
        myentry2 = Entry(canvas2, bd = 3)
        myentry2.place(x = 5, y = 12.5)
     
        var = var + 50
     
    wi = 90
    he  = 90
    canvas_logo = Canvas(win, width= wi, height= he)
    photo = PhotoImage(file=f"{path}image1.gif")
    canvas_logo.create_image(wi/2, he/2 ,image=photo)
    canvas_logo.place(x=600, y=0)
     
    bu_ajout = Button(win, text = "Ajout", command = ajout_)
    bu_ajout.place(x = 0, y = 0)
     
     
    win.after(1000, change_img)
     
     
    win.mainloop()
    Ce qui se passe c'est que lorsque j'appuie sur le bouton Ajout le progr. fait bien ce que je souhaite mais freeze un peu l'application pendant que les images changent dans le canvas. Y'aurait-il un moyen d'éviter cela?

    PS: j'ai essayé de mettre la fonction chang_img en tant que threading mais j'ai toujours le même problème.

    Donc si quelqu'un a déjà rencontré ce problème je veux bien un petit coup de pouce. Merci.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Salut,

    Citation Envoyé par pycarpe Voir le message
    Ce qui se passe c'est que lorsque j'appuie sur le bouton Ajout le progr. fait bien ce que je souhaite mais freeze un peu l'application pendant que les images changent dans le canvas. Y'aurait-il un moyen d'éviter cela?
    Le freeze vient du sleep(1) que vous ne devez pas utilisez dans un callback tkinter... mais que vous avez pallié via .update (qui est une fonctionnalité avancée pas une rustine qu'on emploie à souhait...).

    Quelque part, l'intention derrière l'instruction win.after(1000, change_img) est d'appeler change_img toutes les secondes pour afficher l'image suivante...
    Ce qui veut dire une liste et un index à triturer à chaque appel. Et comme leur état "persiste" pour l'appel suivant, ce seront des objets globaux (ou passés en paramètres de change_img).

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

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2021
    Messages : 38
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Le freeze vient du sleep(1) que vous ne devez pas utilisez dans un callback tkinter... mais que vous avez pallié via .update (qui est une fonctionnalité avancée pas une rustine qu'on emploie à souhait...).

    Quelque part, l'intention derrière l'instruction win.after(1000, change_img) est d'appeler change_img toutes les secondes pour afficher l'image suivante...
    Ce qui veut dire une liste et un index à triturer à chaque appel. Et comme leur état "persiste" pour l'appel suivant, ce seront des objets globaux (ou passés en paramètres de change_img).

    - W
    Merci pour votre diligence. Je suis d'accord avec vous mais sans le sleep la transition entre les images se fait trop vite...du coup comment dois-je faire?...

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Citation Envoyé par pycarpe Voir le message
    Merci pour votre diligence. Je suis d'accord avec vous mais sans le sleep la transition entre les images se fait trop vite...du coup comment dois-je faire?...
    Je vous l'ai expliqué: une liste de Photoimage et un index, variables globales, pour que change_img se contente de récupérer et afficher l'image suivante.
    note: si à la place d'une liste de Photoimage, vous avez une liste de fichiers, il ne faut pas oublier d'assigner aussi la photoimage à une variable globale (ou qui persiste à la fonction).

    Je suppose qu'arrivé à programmer avec tkinter listes et portée des variables ne sont pas des notions totalement inconnues...

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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/07/2009, 16h12
  2. Réponses: 1
    Dernier message: 26/02/2009, 22h05
  3. Affichage d'image .bmp dans cellule excel 2003
    Par samson_02 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 03/02/2009, 22h10
  4. [MySQL] Affichage des images insérés dans une base Mysql
    Par ines_m dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/05/2008, 17h54
  5. [SQL] affichage de tables différentes dans un même tableau
    Par brindherbe86 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 13/03/2008, 12h33

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