Contenu | Rechercher | Menus

Annonce

La nouvelle clé USB Ubuntu-fr est en prévente
Rendez-vous sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/09/2019, à 18:35

pseudofab

[résolu]IDLE: souci d'exécution de programme avec Tkinter

############## Titre modifié . anciennement: Python : comportement dans boucle que je ne comprends pas
Bonjour,
Soit le code ci dessous:

import tkinter as tk
class Affiche:
    def __init__(self):
        self.root = tk.Tk()
        self.label = tk.Label(text= "Jeux du pendu", font=('Courier', 50, 'bold'))
        self.label.grid()
        self.can = tk.Canvas(self.root, width=264, height=183, bg='black')
        self.can.grid()
        
    def  aff(self, nbr_pendu):
        """Affiche l'image du pendu correspondant au nbr_pendu indiqué """
        self.mon_image = tk.PhotoImage(file =  "/home/fabien/mes_scripts/photo_jeux_du_pendu/pendu_"
                                       + str(nbr_pendu) + ".gif")
        self.can.create_image(0,0, anchor='nw', image=self.mon_image)

a = Affiche()
for i in range(6):
    a.aff(i)
    input('Appuie la touche entrée pour continuer')
            

Ce code ne s'exécute pas bien sur IDLE... 

pseudofab a écrit :
pseudofab a écrit :

Je ne comprends pas le souci que je rencontre avec IDLE ... en fait la seule image qui apparaît est celle correspondant à la valeur du i en sortie de la boucle for in range(6), ou, au moment de sa valeur au moment d'une interruption du programme par un Ctrl+D
Je modifie le titre de la discussion en rapport à ce nouveau questionnement .

La méthode aff de la classe Affiche affiche l'image du pendu correspondant à l'argument précisé.
Aussi après avoir initialisé a = Affiche(), a.aff(0) affiche l'image pendu_0,
                                                                        a.aff(1) affiche l'image pendu_1,
                                                                        a.aff(2) affiche l'image pendu_2,
                                                                        ,..., ect
Tout cela semble bien fonctionner , cependant ce n'est plus le cas quand je mets la méthode dans une boucle . Pourquoi?

[s]a = Affiche()
for i in range(6):
    a.aff(i)
    input('Appuie la touche entrée pour continuer')[/s]

Dernière modification par pseudofab (Le 05/09/2019, à 22:07)


# Là pour le plaisir de découvrir .

# Débutant en tout ...  je me régale !

Hors ligne

#2 Le 05/09/2019, à 19:14

pingouinux

Re : [résolu]IDLE: souci d'exécution de programme avec Tkinter

Bonsoir,
Je viens de tester, et j'obtiens le même résultat avec ou sans la boucle (c'est-à-dire que ça fonctionne dans les deux cas).
Peux-tu montrer le script complet ?

Hors ligne

#3 Le 05/09/2019, à 19:58

pseudofab

Re : [résolu]IDLE: souci d'exécution de programme avec Tkinter

Bonsoir pingouinux,
merci d'avoir testé .
Suite à ta remarque j' essaie le code sur IPython et là, il fonctionne !..

Par contre, je ne sais pas pourquoi avec IDLE , le code (celui que j'ai donné )s'exécute mal .
...Quelque part, cela me rassure car je ne comprenais pas le comportement et j'en devenais chèvre. lol


# Là pour le plaisir de découvrir .

# Débutant en tout ...  je me régale !

Hors ligne

#4 Le 05/09/2019, à 20:06

pingouinux

Re : [résolu]IDLE: souci d'exécution de programme avec Tkinter

De mon côté, j'ai exécuté le script ainsi

python3 le_script

:

Hors ligne

#5 Le 05/09/2019, à 20:28

pseudofab

Re : [résolu]IDLE: souci d'exécution de programme avec Tkinter

Je ne comprends pas le souci que je rencontre avec IDLE ... en fait la seule image qui apparaît est celle correspondant à la valeur du i en sortie de la boucle for in range(6), ou, au moment de sa valeur au moment d'une interruption du programme par un Ctrl+D
Je modifie le titre de la discussion en rapport à ce nouveau questionnement .


# Là pour le plaisir de découvrir .

# Débutant en tout ...  je me régale !

Hors ligne

#6 Le 05/09/2019, à 22:05

pseudofab

Re : [résolu]IDLE: souci d'exécution de programme avec Tkinter

J'ai regardé la doc IDLE ...
En fait, si on utilise tkinter dans IDLE, il est nécessaire d'ajouter root.update() pour afficher l'image .

import tkinter as tk
class Affiche:
    def __init__(self):
        self.root = tk.Tk()
        self.label = tk.Label(text= "Jeux du pendu", font=('Courier', 50, 'bold'))
        self.label.grid()
        self.can = tk.Canvas(self.root, width=264, height=183, bg='black')
        self.can.grid()
        
    def  aff(self, nbr_pendu):
        """Affiche l'image du pendu correspondant au nbr_pendu indiqué """
        self.mon_image = tk.PhotoImage(file =  "/home/fabien/mes_scripts/photo_jeux_du_pendu/pendu_"
                                       + str(nbr_pendu) + ".gif")
        self.can.create_image(0,0, anchor='nw', image=self.mon_image)
        self.root.update()

J'édite en Résolu

Dernière modification par pseudofab (Le 05/09/2019, à 22:09)


# Là pour le plaisir de découvrir .

# Débutant en tout ...  je me régale !

Hors ligne

#7 Le 06/09/2019, à 06:36

pingouinux

Re : [résolu]IDLE: souci d'exécution de programme avec Tkinter

D'ailleurs, ça marche aussi en lançant le script directement.

$ pydoc3 tkinter.Tk.update

Help on function update in tkinter.Tk:

tkinter.Tk.update = update(self)
    Enter event loop until all pending events have been processed by Tcl.

Hors ligne

#8 Le 06/09/2019, à 08:29

pseudofab

Re : [résolu]IDLE: souci d'exécution de programme avec Tkinter

Merci,
Bon en ce qui nous concerne c'est dans la doc de IDLE qu'il fallait jeter un coup d'oeil ...
D'après ce que je comprends l'emploie de tkinter.Tk.update est nécessaire qu'avec l'utilisation de IDLE parce que lui même est écrit avec python/tkinter ..


# Là pour le plaisir de découvrir .

# Débutant en tout ...  je me régale !

Hors ligne

#9 Le 06/09/2019, à 08:44

pingouinux

Re : [résolu]IDLE: souci d'exécution de programme avec Tkinter

D'après ce que je comprends l'emploie de tkinter.Tk.update est nécessaire qu'avec l'utilisation de IDLE parce que lui même est écrit avec python/tkinter .

Je ne peux pas répondre. Il est peut-être prudent de le mettre systématiquement, pour être certain que l'affichage soit à jour.

Hors ligne

#10 Le 06/09/2019, à 08:56

pseudofab

Re : [résolu]IDLE: souci d'exécution de programme avec Tkinter

Peut être ...
Cependant je lis la mise en garde suivante :

http://tkinter.fdex.eu/doc/uwm.html#update a écrit :

update()

    Cette méthode force le rafraîchissement de l’affichage. Vous ne devriez l’utiliser que si vous savez ce que vous faites puisqu’elle peut conduire à un comportement imprévisible ou à une boucle infinie. Dans tous les cas, elle ne devrait jamais être appelée à partir d’un gestionnaire d’événement ou d’une fonction appelée par un tel gestionnaire.


# Là pour le plaisir de découvrir .

# Débutant en tout ...  je me régale !

Hors ligne

#11 Le 06/09/2019, à 09:21

pingouinux

Re : [résolu]IDLE: souci d'exécution de programme avec Tkinter

Effectivement. Si par exemple on modifie une image pixel par pixel, il ne faut pas forcer l'affichage après chaque pixel modifié.

Hors ligne

#12 Le 06/09/2019, à 09:40

pseudofab

Re : [résolu]IDLE: souci d'exécution de programme avec Tkinter

merci pour ton exemple, je comprends maintenant le sens de cette mise en garde...


# Là pour le plaisir de découvrir .

# Débutant en tout ...  je me régale !

Hors ligne