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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| #!/usr/bin/env python
# -*- coding:utf-8 -*-
from Tkinter import *
from random import randrange
import time
import sys
# ==============================================
# 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.reference = refe
class Application:
def __init__(self):
self.root=Tk()
self.r_max = 10
# on cache la fenêtre principale, mère de toutes les autres
self.root.withdraw()
self.Graphique()
while (self.flag_loop == 1):
self.replacer()
self.root.mainloop()
def replacer(self):
# Avec except KeyboardInterrupt pour eviter une erreur sur ctrl+c
try:
while self.flag_loop == 1:
for etoi in self.lesetoiles:
xxx = int(etoi.x)
yyy = int(etoi.y)
if (xxx > self.la):
xxx = 0
yyy = randrange(self.ha)
etoi.rayon = randrange(1,self.r_max)
r = int(etoi.rayon)
xxx = xxx + (r * 1.5)
etoi.x = xxx
etoi.y = yyy
self.espace.coords(etoi.reference ,xxx-r, yyy-r, xxx+r, yyy+r)
self.root.after(50, self.root.update())
except KeyboardInterrupt:
self.detruire()
def Graphique(self):
self.flag_affichage = 1
self.flag_loop = 1
self.la, self.ha = 0, 0
self.mafenetre=Toplevel()
self.mafenetre.title('Espace et étoiles')
self.mafenetre.protocol("WM_DELETE_WINDOW", self.detruire)
self.nbreetoiles = 100
# nouvelles coordonnées du centre du canvas :
self.x0 = self.la/2
self.y0 = self.ha/2
self.espace = Canvas(self.mafenetre, bg="black", width=self.la, height=self.ha)
self.espace.pack(side=TOP, fill=BOTH, expand=YES)
self.modif_affichage()
# Bind du clic gauche pour fermer et du clic droit pour modifier l'affichage.
self.espace.bind('<ButtonRelease-1>', self.detruire)
self.espace.bind('<ButtonRelease-3>', self.modif_affichage)
def creation_etoiles(self):
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(1,self.r_max)
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="grey")
et.donner_reference(ref_et)
self.lesetoiles.append(et)
def detruire(self, event=None):
# event = None car bind retourne un event
print ("On detruit la TopLevel()...")
self.flag_loop = 0 # pour empêcher le dernier loop quand la TopLevel() est détruite
self.mafenetre.destroy()
sys.exit(0)
def modif_affichage(self, event = None):
# self.flag_affichage == 0 : Mode fenètre
# self.flag_affichage == 1 : Plein écran
if self.flag_affichage == 0:
self.flag_affichage = 1
self.la = self.root.winfo_screenwidth()
self.ha = self.root.winfo_screenheight()
self.mafenetre.geometry(str(self.la)+"x"+str(self.ha))
elif self.flag_affichage == 1:
self.flag_affichage = 0
self.la = 800
self.ha = 600
self.mafenetre.geometry("%dx%d+%d+%d" % (self.la,self.ha,(self.root.winfo_screenwidth()-self.la)/2, (self.root.winfo_screenheight()-self.ha)/2))
self.espace.delete(ALL)
self.creation_etoiles()
# départ du programme principal :
if __name__ == '__main__':
app = Application() |
Partager