J'ai écrit le code suivant, qui permet de replacer aléatoirement un certain nombre d'étoiles dans un Canvas de Tkinter :

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
# -*- coding:utf-8 -*-
from Tkinter import *
from random import randrange
import time
 
# ==============================================
# Espace et étoiles
# Codé sous Windows Xp avec Python 2.6.4.
# par C. Gigante : http://www.gigante.be/python/
# Janvier 2010
# ==============================================
 
class Etoile:
    def __init__(self, dir, ray=1, x=0, y=0, dist=1):
        self.x = x
        self.y = y
        self.dir = dir
        self.rayon = ray
        self.dist = dist
 
    def donner_reference(self, refe):
        # contient la référence du cercle tracé sur le canvas espace
        self.ref = refe
 
class Application:
    def __init__(self):
        self.root=Tk()
        self.root.title('Espace et étoiles')
        self.la = 600
        self.ha = 400
        self.root.geometry(str(self.la)+"x"+str(self.ha))
 
        self.nbreetoiles = 30
 
        # nouvelles coordonnées du centre du canvas :
        self.x0 = self.la/2
        self.y0 = self.ha/2
 
        self.but = Button(self.root, text="Redessiner", command=self.replacer_etoiles)
        self.but.pack(side=BOTTOM)
 
        self.espace = Canvas(self.root, bg="black", width=self.la, height=self.ha)
        self.espace.pack(side=TOP, fill=BOTH, expand=YES)
 
        self.lesetoiles = []
        # création des étoiles :
        for i in range(1,self.nbreetoiles):
            xx, yy, direction, rayo = randrange(self.la), randrange(self.ha), randrange(360), randrange(10)
            et = Etoile(direction,rayo,xx,yy,1)
            ref_et = self.espace.create_oval(xx-rayo,yy-rayo,xx+rayo,yy+rayo,tag=str(i), fill="yellow")
            et.donner_reference(ref_et)
            self.lesetoiles.append(et)
 
        self.root.mainloop()
 
    def replacer_etoiles(self):
        for i in range(1,self.nbreetoiles):
            xx, yy, direction, rayo = randrange(self.la), randrange(self.ha), randrange(360), randrange(10)
            self.espace.coords(str(i),xx-rayo,yy-rayo,xx+rayo,yy+rayo)
 
# départ du programme principal :
if __name__ == '__main__':
    app = Application()
Le programme marche très bien, mais ce que je voudrais, c'est supprimer le bouton "Redessiner" et faire en sorte que la méthode self.replacer_etoiles() soit appelée automatiquement toutes les 2 secondes.

Je ne vois pas comment faire ?

Est-il possible de faire cela en évitant d'utiliser les threads ?