programmer le lancement de fonctions avec after()
Bonjour à vous
Je suis en train de créer une interface dans laquelle apparaîtrons divers messages à des intervalles pré-programmés.
Des mp3 seront également lancés.
J'ai fait des recherches sur TKinter et j'ai compris trois choses :
1- Il vaut mieux éviter les fonctions bloquantes comme time.sleep()
2- Il vaut mieux utiliser la méthode after() faite exprès dans tkinter
3- Il sera nécessaire d'utiliser des threads pour qu'un chronomètre puisse défiler à l'écran pendant qu'un mp3 est lu.
Il me semble, après documentation et plusieurs expérimentations, avoir compris l'usage des threads.
J'ai donc créé un petit programme pour étudier la méthode after() mais je reste bloqué. C'est un simulateur d'automatisation d'aquarium.
Ce programme devrait, selon moi, informer du jour dans la première étiquette et, chaque jour, afficher les divers événements déclenchés au fur et à mesure (lumière, nourriture...) dans la seconde étiquette. Devraient défiler comme ça, tous les jours de la semaine.
(Les intervalles (2000), seront remplacés ultérieurement par des variables rassemblées dans un tableau.)
Cependant, mon programme ne fonctionne pas : La fenêtre ne s'ouvre qu'à la toute fin de l’exécution du programme.
Je me casse la tête depuis bien longtemps et il n'y a aucun message d'erreur pour m'orienter.
J'ai utilisé le débugueur de Thonny, mais j'ai l'impression que tout se passe bien.
Voici mon code :
Code:
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
|
"""
Programme pour comprendre l'utilisation de after()
Essai avec des StringVar() --> Exactement le même problème :
La fenêtre ne s'ouvre que tout à la fin
Je ne souhaite pas utiliser l'heure car dans mon vrai programme, seul le temps relatifs (les intervalles) m'intéresseront
"""
import tkinter as tk
root = tk.Tk()
root.title("Exemple d'utilisation de after()")
root.geometry("300x70")
semaine = ["lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"]
label1_vc = tk.StringVar(value = "Jour de la semaine")
label2_vc = tk.StringVar(value = "Événement")
# Créer une vignette (label) pour afficher le texte
label1 = tk.Label(textvariable = label1_vc)
label1.pack(pady=5)
# Créer une vignette (label) pour afficher le texte
label2 = tk.Label(textvariable = label2_vc)
label2.pack(pady=5)
cumul = 1000
def aqua_prog(jour):
global cumul # Je n'aime global, il faudra trouver comment s'en débarasser après.
# Fonction pour mettre à jour l'étiquette
def update_text(new_text):
label1_vc.set(f"Nous sommes {jour}.")
label2_vc.set(new_text)
root.after(cumul, update_text, "Allumage de l'aquarium")
cumul = cumul + 2000 # Les valleurs ajoutées (intervalles) seront des variables rassemblées dans un tableau
# Les poissons ne sont pas nourris les mercredis et les dimanches
if jour == "mercredi" or jour == "dimanche":
root.after(cumul, None)
cumul = cumul + 2000
else:
root.after(cumul, update_text, "Nourrissage des poissons")
cumul = cumul + 2000
root.after(cumul, update_text, "Extinction de l'aquarium")
cumul = cumul + 2000
for i in semaine:
aqua_prog(i)
root.mainloop() |
Merci pour votre aide