Tkinter, l'exécution des fonctions au fil du temps
Je suis nouveau sur tkinter, et je suis à essayer de comprendre comment le contrôle de flux de travaux.
Je veux afficher un rectangle et faire clignoter trois fois. J'ai écrit ce code, mais ça ne fonctionne pas. Je suppose que c'est parce que blink
est exécutée avant mainloop
, et il ne fait pas de dessiner n'importe quoi. Si oui, comment puis-je échanger le contrôle de flux entre blink
et mainloop
pour le faire fonctionner? Je vous remercie à l'avance!
Mon code:
from tkinter import *
from time import *
def blink(rectangle, canvas):
for i in range(3):
canvas.itemconfigure(rectangle, fill = "red")
sleep(1)
canvas.itemconfigure(rectangle, fill = "white")
sleep(1)
root = Tk()
fr = Frame(root)
fr.pack()
canv = Canvas(fr, height = 100, width = 100)
canv.pack()
rect = canv.create_rectangle(25, 25, 75, 75, fill = "white")
blink(rect, canv)
root.mainloop()
OriginalL'auteur wazabit | 2012-02-18
Vous devez vous connecter pour publier un commentaire.
La programmation événementielle nécessite une mentalité différente de code de procédure. Votre demande est en cours d'exécution dans une boucle infinie, tirant des événements hors de la file d'attente et de traitement. Pour faire de l'animation, tout ce que vous devez faire est de placer les éléments sur cette file d'attente à un moment approprié.
Widgets Tkinter ont une méthode nommée après qui permet de programmer les fonctions à exécuter après une certaine période de temps. La première étape est d'écrire une fonction qui ne fait qu'une "image" de votre animation. Dans votre cas, vous êtes à la définition de l'animation de la commutation entre les deux couleurs. Une fonction qui vérifie la couleur actuelle, puis passe à l'autre couleur est tout ce dont vous avez besoin:
Maintenant, nous avons juste besoin d'avoir cette fonction exécuter trois fois à l'un des intervalles d'une seconde:
Lorsque vous démarrez votre boucle principale, après une seconde, la couleur va changer, après une seconde, il va changer à nouveau, et après une troisième seconde, il va changer à nouveau.
Qui fonctionne pour votre besoin spécifique, mais ce n'est pas une très bonne solution générale. Plus générale de la solution est d'appeler
blink
une fois, puis ontblink
appel lui-même à nouveau après une certaine période de temps.blink
doit alors être responsable de savoir quand s'arrêter de clignoter. Vous pouvez définir un indicateur ou d'un comptoir, de la sorte, pour garder une trace de combien de fois vous ai cligné des yeux. Par exemple:Comme un dernier petit conseil, je vous recommande de définir votre programme en tant que classe, puis de créer une instance de cette classe. Ce qu'il fait en sorte que vous n'avez pas besoin des fonctions globales, et vous n'avez pas besoin de passer autant d'arguments. Il n'a pas vraiment d'importance pour un 20 ligne de programme, mais il commence à compter lorsque vous voulez écrire quelque chose de substantiel.
Par exemple:
OriginalL'auteur Bryan Oakley
Chaque widget a un "après" fonction - c'est-à-dire qu'il peut appeler une autre fonction après une période de temps spécifiée - Donc, ce que vous voulez faire est d'appeler:
Si vous voulez qu'il soit une répétition de l'appel, il suffit d'appeler "après", de nouveau à l'intérieur de votre fonction de clignotement. Le seul problème que vous aurez est le passage d'arguments à clignoter - peut-être regarder à l'aide de lamda à l'intérieur de "l'après" pour que.
OriginalL'auteur Shane C. Mason