Accueil > > > TK_WATCH :HORLOGE GRAPHIQUE
TK_WATCH :HORLOGE GRAPHIQUE
Information sur la source
Description
Salut c'est un exercice Graphique/Thread que j'ai fait lorsque j'apprenait à manier le Python depuis j'oublie de le mettre sur la toile juste au cas où. J'espère que les critiques ne seront pas trop rudes. Mais lachez vous quand même.
Source
- # coding:latin1
- """gui Watch
- ## Programme: Tk_Watch
- ## Version: 1.0
- ## Auteur: Awounang Nekdem Franck
- """
- import tkMessageBox as tk
- from Tkinter import *
- from threading import Thread
- from time import sleep, time
- from math import pi, cos, sin, exp
- from winsound import Beep
-
-
- def Rot(x, y, a=0, b=0, ang=1):
- "fait tourner l'objet (x,y) d'un angle <ang> par rapport à (a,b)"
- z = complex(float(x), float(y))
- t = ang*pi/180
- a1 = complex(cos(t),sin(t))
- z0 = complex(a,b)
- z1 = z*a1 + z0*(1-a1)
- return z1.real, z1.imag
-
- class pendule:
- "balançoire pour horloge"
- def __init__(self, boss):
- "contructeur de balançoire"
- self.canev = Canvas(boss, width = 80, height = 120, bg="ivory",bd=2,relief="raised") #instantiation(création) d'un Canvas
- larg, haut = int(self.canev.cget("width")), int(self.canev.cget("height"))
- self.tige = self.canev.create_line(larg/2+2,5,larg/2+2,haut-5,width = 2) #dessin et sauvegarde de la tige du pendule
- self.boule = self.canev.create_oval(larg/2+2-3, haut- 5 - 3, larg/2+2+3,haut - 5 + 3,fill = "brown") #dessin et sauvegarde de la boule du pendule
- self.canev.pack()
- self.cent = larg/2+2,5 #sauvegarde des coordonnées du centre de rotation de laboule
- self.x_b = larg/2+2 #abscisse de la boule du pendule
- self.y_b = haut/2-5 #ordonnée de la boule du pendule
-
- class cani(Canvas):
- "cadrant d'horloge."
- def __init__(self, larg=190,haut=160, coul="ivory",boss=None,one = True):
- "constructeur de notre cadrant"
- Canvas.__init__(self, width=larg, height=haut, bg=coul, master=boss, bd=2, relief="raised")
- x_c,y_c = larg/2+2,haut/2+2
- a,b = x_c, 8
- r = larg/2-8
- self.cent = x_c, y_c #coordonnées du centre de l'horloge
- self.x_h, self.y_h = x_c,36 #coordonnées de l'aiguille des heures
- self.x_m, self.y_m = x_c, 24 #coordonnées de l'aiguille des minutes
- self.x_s, self.y_s = x_c, 12 #coordonnées de l'aiguille des secondes
- self.create_oval(x_c-r,y_c-r,x_c+r,y_c+r,width=4) #cercle contenant les aiguilles
- c,d,x,y = x_c,14,x_c,16
- self.one = one
- for i in range(1,61): #positionnement de points(minutes/secondes)
- c,d = Rot(c,d,x_c,y_c,6)
- x,y = Rot(x,y,x_c,y_c,6)
- self.create_line(c,d,x,y,fill="light green",width = 1.75)
- for i in range(1,13): #positionnement des heures
- a,b = Rot(a,b,x_c,y_c,30)
- self.create_text(a,b,text=str(i))
- self.H = self.create_line(x_c,y_c,x_c,36,width=4,fill="gold",smooth=1,arrow="last") #dessin de l'aiguille des heures et sauvegarde
- self.M = self.create_line(x_c,y_c,x_c,24,width=2,fill="red",smooth=1,arrow="last") #dessin de l'aiguille de minutes et sauvegarde
- self.S = self.create_line(x_c,y_c,x_c,12,smooth=1,arrow="last") #dessin de l'aiguille des secondes et sauvegarde
-
-
- #routine permetant de faire évoluer les aiguilles et le pendule
- class Trd(Thread):
- "Processus qui permet de mettre en marche les différentes animations"
- def __init__(self,can=None):
- Thread.__init__(self)
- self.a = 1
- self.can = can
-
- def do(self):
- self.a = 1
-
- def run(self):
- "fonction principale du processus"
- while self.a == 1:
- sleep(.05)
- cent = self.can.cent
- a,b = cent
- #juste au cas où il y aurait un problème quelconque:
- try:
- x_h,y_h = self.can.x_h,self.can.y_h
- x_m,y_m = self.can.x_m,self.can.y_m
- x_s,y_s = self.can.x_s,self.can.y_s
- except:
- self.a = None
- if value.get() == True: #si la case continue est cochée, on prend en compte les virgules
- tmp = time()
- else: #si la case trotte est cochée, on ne compte que les entiers
- tmp = int(time())
- c_x, c_y = pend.cent
- x_b = pend.x_b
- y_b = pend.y_b
- ang = (30*pi/360)*sin(pi*(time() + .5))
- Long = 110
- x_t = (Long*sin(30*pi/360)*sin(pi*(time() + .5))+c_x) #calcul de l'abcisse de la boule du pendule
- y_t = Long*cos(ang)+c_y #calcul de l'ordonnée de la boule du pendule
- if son.get() == True: #vérifie si la case <sound on> est cochée
- if abs(x_t) > Long*sin(29.85*pi/360) + c_x: #si le pendule atteint une de ses positions extrêmes alors "ding"
- Beep(564,50)
- pend.canev.configure(bg="grey95")
- if x_t < c_x-Long*sin(29.85*pi/360): #si le pendule atteint l'autre de ses positions extrêmes alors "dong"
- Beep(356,50)
- pend.canev.configure(bg="grey90")
- pend.canev.coords(pend.tige,c_x,c_y,x_t,y_t) #repositionnement de la tige du pendule
- pend.canev.coords(pend.boule,x_t-3,y_t-3,x_t+3,y_t+3) #repositionnement de la boule du pendule
- #calculs des heures,minutes et secondes en fonction du temps revenvoyé par la machine
- t = tmp
- sec = t
- secs = sec%60
- Min = (tmp)/60
- mins = Min%60
- heur = (tmp-secs)/(3600)
- heurs = heur%60 + 2 #le 2 c'est pour le décalage horaire de ma montre j'ai pas trouvé mieux
- #calculs des angle que doivent faire les aiguilles des heures, minutes et secondes avec l'axe des abcsisses
- ang_h = heurs*30
- ang_m = Min*6
- ang_s = secs*6
- #détermination des coordonnées des aiguilles en fonction de ces aiguilles
- x_h,y_h = Rot(x_h,y_h,a,b,ang_h)
- x_m,y_m = Rot(x_m,y_m,a,b,ang_m)
- x_s,y_s = Rot(x_s,y_s,a,b,ang_s)
- #repositionnnement des aiguilles
- try:
- self.can.coords(self.can.H,a,b,x_h,y_h)
- self.can.coords(self.can.M,a,b,x_m,y_m)
- self.can.coords(self.can.S,a,b,x_s,y_s)
- root.update()
- except:
- self.a = None
- self.stop(None)
-
- def stop(self,event):
- "fonction qui stoppe ce procesus"
- self.a = None
-
-
- ### code de test:###
- if __name__ == "__main__":
- root = Tk()
- root.title("spy_horloge")
- root.overrideredirect(1)
- root.resizable(False,False)
- frm = Frame(root, bd=2,relief="raised")
- frm2 = Frame(root,bd=2,relief="sunken")
- me = cani(boss = frm)
- me.pack(side="top")
- frm.pack()
- frm2.pack()
- pend = pendule(frm)
- t = Trd(me)
- son = BooleanVar(root,False)
- chk = Checkbutton(frm2, text = "sound on",variable = son)
- chk.pack(side="top")
- value = BooleanVar(root,True)
- c = Radiobutton(frm2,text = "continue",value = True,variable=value)
- c.pack(side="left")
- trot = Radiobutton(frm2,text = "trotte",value = False,variable=value)
- trot.pack(side="right")
-
- def play():
- caption = btn1.cget("text")
- if caption == "Start":
- btn1.configure(text="Stop")
- t.do()
- t.run()
- else:
- btn1.configure(text="Start")
- t.stop(None)
-
- btn1 = Button(root,text="Start",command=play,bg="grey70")
- btn1.pack(side="left",pady=5,padx=2)
- Button(root,text="Exit",command=root.destroy,bg="grey65").pack(side="right",pady=5,padx=2)
- root.bind("<Destroy>",t.stop)
- tk.Message(title = "About",message = "Ecrit par spy_anf\nThanks to Gerard Swinnen",master=root).show()
- root.mainloop()
# coding:latin1
"""gui Watch
## Programme: Tk_Watch
## Version: 1.0
## Auteur: Awounang Nekdem Franck
"""
import tkMessageBox as tk
from Tkinter import *
from threading import Thread
from time import sleep, time
from math import pi, cos, sin, exp
from winsound import Beep
def Rot(x, y, a=0, b=0, ang=1):
"fait tourner l'objet (x,y) d'un angle <ang> par rapport à (a,b)"
z = complex(float(x), float(y))
t = ang*pi/180
a1 = complex(cos(t),sin(t))
z0 = complex(a,b)
z1 = z*a1 + z0*(1-a1)
return z1.real, z1.imag
class pendule:
"balançoire pour horloge"
def __init__(self, boss):
"contructeur de balançoire"
self.canev = Canvas(boss, width = 80, height = 120, bg="ivory",bd=2,relief="raised") #instantiation(création) d'un Canvas
larg, haut = int(self.canev.cget("width")), int(self.canev.cget("height"))
self.tige = self.canev.create_line(larg/2+2,5,larg/2+2,haut-5,width = 2) #dessin et sauvegarde de la tige du pendule
self.boule = self.canev.create_oval(larg/2+2-3, haut- 5 - 3, larg/2+2+3,haut - 5 + 3,fill = "brown") #dessin et sauvegarde de la boule du pendule
self.canev.pack()
self.cent = larg/2+2,5 #sauvegarde des coordonnées du centre de rotation de laboule
self.x_b = larg/2+2 #abscisse de la boule du pendule
self.y_b = haut/2-5 #ordonnée de la boule du pendule
class cani(Canvas):
"cadrant d'horloge."
def __init__(self, larg=190,haut=160, coul="ivory",boss=None,one = True):
"constructeur de notre cadrant"
Canvas.__init__(self, width=larg, height=haut, bg=coul, master=boss, bd=2, relief="raised")
x_c,y_c = larg/2+2,haut/2+2
a,b = x_c, 8
r = larg/2-8
self.cent = x_c, y_c #coordonnées du centre de l'horloge
self.x_h, self.y_h = x_c,36 #coordonnées de l'aiguille des heures
self.x_m, self.y_m = x_c, 24 #coordonnées de l'aiguille des minutes
self.x_s, self.y_s = x_c, 12 #coordonnées de l'aiguille des secondes
self.create_oval(x_c-r,y_c-r,x_c+r,y_c+r,width=4) #cercle contenant les aiguilles
c,d,x,y = x_c,14,x_c,16
self.one = one
for i in range(1,61): #positionnement de points(minutes/secondes)
c,d = Rot(c,d,x_c,y_c,6)
x,y = Rot(x,y,x_c,y_c,6)
self.create_line(c,d,x,y,fill="light green",width = 1.75)
for i in range(1,13): #positionnement des heures
a,b = Rot(a,b,x_c,y_c,30)
self.create_text(a,b,text=str(i))
self.H = self.create_line(x_c,y_c,x_c,36,width=4,fill="gold",smooth=1,arrow="last") #dessin de l'aiguille des heures et sauvegarde
self.M = self.create_line(x_c,y_c,x_c,24,width=2,fill="red",smooth=1,arrow="last") #dessin de l'aiguille de minutes et sauvegarde
self.S = self.create_line(x_c,y_c,x_c,12,smooth=1,arrow="last") #dessin de l'aiguille des secondes et sauvegarde
#routine permetant de faire évoluer les aiguilles et le pendule
class Trd(Thread):
"Processus qui permet de mettre en marche les différentes animations"
def __init__(self,can=None):
Thread.__init__(self)
self.a = 1
self.can = can
def do(self):
self.a = 1
def run(self):
"fonction principale du processus"
while self.a == 1:
sleep(.05)
cent = self.can.cent
a,b = cent
#juste au cas où il y aurait un problème quelconque:
try:
x_h,y_h = self.can.x_h,self.can.y_h
x_m,y_m = self.can.x_m,self.can.y_m
x_s,y_s = self.can.x_s,self.can.y_s
except:
self.a = None
if value.get() == True: #si la case continue est cochée, on prend en compte les virgules
tmp = time()
else: #si la case trotte est cochée, on ne compte que les entiers
tmp = int(time())
c_x, c_y = pend.cent
x_b = pend.x_b
y_b = pend.y_b
ang = (30*pi/360)*sin(pi*(time() + .5))
Long = 110
x_t = (Long*sin(30*pi/360)*sin(pi*(time() + .5))+c_x) #calcul de l'abcisse de la boule du pendule
y_t = Long*cos(ang)+c_y #calcul de l'ordonnée de la boule du pendule
if son.get() == True: #vérifie si la case <sound on> est cochée
if abs(x_t) > Long*sin(29.85*pi/360) + c_x: #si le pendule atteint une de ses positions extrêmes alors "ding"
Beep(564,50)
pend.canev.configure(bg="grey95")
if x_t < c_x-Long*sin(29.85*pi/360): #si le pendule atteint l'autre de ses positions extrêmes alors "dong"
Beep(356,50)
pend.canev.configure(bg="grey90")
pend.canev.coords(pend.tige,c_x,c_y,x_t,y_t) #repositionnement de la tige du pendule
pend.canev.coords(pend.boule,x_t-3,y_t-3,x_t+3,y_t+3) #repositionnement de la boule du pendule
#calculs des heures,minutes et secondes en fonction du temps revenvoyé par la machine
t = tmp
sec = t
secs = sec%60
Min = (tmp)/60
mins = Min%60
heur = (tmp-secs)/(3600)
heurs = heur%60 + 2 #le 2 c'est pour le décalage horaire de ma montre j'ai pas trouvé mieux
#calculs des angle que doivent faire les aiguilles des heures, minutes et secondes avec l'axe des abcsisses
ang_h = heurs*30
ang_m = Min*6
ang_s = secs*6
#détermination des coordonnées des aiguilles en fonction de ces aiguilles
x_h,y_h = Rot(x_h,y_h,a,b,ang_h)
x_m,y_m = Rot(x_m,y_m,a,b,ang_m)
x_s,y_s = Rot(x_s,y_s,a,b,ang_s)
#repositionnnement des aiguilles
try:
self.can.coords(self.can.H,a,b,x_h,y_h)
self.can.coords(self.can.M,a,b,x_m,y_m)
self.can.coords(self.can.S,a,b,x_s,y_s)
root.update()
except:
self.a = None
self.stop(None)
def stop(self,event):
"fonction qui stoppe ce procesus"
self.a = None
### code de test:###
if __name__ == "__main__":
root = Tk()
root.title("spy_horloge")
root.overrideredirect(1)
root.resizable(False,False)
frm = Frame(root, bd=2,relief="raised")
frm2 = Frame(root,bd=2,relief="sunken")
me = cani(boss = frm)
me.pack(side="top")
frm.pack()
frm2.pack()
pend = pendule(frm)
t = Trd(me)
son = BooleanVar(root,False)
chk = Checkbutton(frm2, text = "sound on",variable = son)
chk.pack(side="top")
value = BooleanVar(root,True)
c = Radiobutton(frm2,text = "continue",value = True,variable=value)
c.pack(side="left")
trot = Radiobutton(frm2,text = "trotte",value = False,variable=value)
trot.pack(side="right")
def play():
caption = btn1.cget("text")
if caption == "Start":
btn1.configure(text="Stop")
t.do()
t.run()
else:
btn1.configure(text="Start")
t.stop(None)
btn1 = Button(root,text="Start",command=play,bg="grey70")
btn1.pack(side="left",pady=5,padx=2)
Button(root,text="Exit",command=root.destroy,bg="grey65").pack(side="right",pady=5,padx=2)
root.bind("<Destroy>",t.stop)
tk.Message(title = "About",message = "Ecrit par spy_anf\nThanks to Gerard Swinnen",master=root).show()
root.mainloop()
Conclusion
Bon c'est juste pour aider ceux que je pourrais à manier plus adroitement Tkinter et Python en gros
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Librairie graphique vectoriel [ par DoudouBidou ]
Bonjour, j'ai depuis quelques jour un projet en tête, celui de réaliser un logiciel de saisi de schéma électrique en python.
Appel d'une fonction [ par Thomeux ]
Bonjour,Je débute en python.J'essais de structurer mon Programme de la manière suivante :Un fichier bibliothèque fonction, :Un Fichi
Probleme de conception [ par JoeNamat ]
Bonjour a vous,Je ne suis pas un tres bon programmeur et j'ai programme une interface graphique en python avec PyGTK. Cette interface graphique interr
Développement d'un logiciel de calculs en Python [ par icornato ]
Bonjour à tousIngénieur dans un BE, j'ai développé un programme d'environ 10 000 lignes en VB pour effectuer du calcul d'éléments poutre (calcul matri
Python et Octave"matlab" [ par soufianovich ]
Bonjour, je suis stagiaire dans une entreprise, jai fait un code octave ou"matlab" c'est la meme chose qui traite mes données. Maintenant je suis en t
Python et octave [ par soufianovich ]
Bonjour, je suis stagiaire dans une entreprise, jai fait un code octave ou"matlab" c'est la meme chose qui traite mes données. Maintenant je suis en t
chat basique en python [ par rezuz ]
bonjour, je suis en train d'essayer de programmer un chat en python, principalement dans le but d'apprendre l'utilisation des sockets et de la commun
urllib2 et interface graphique [ par rezuz ]
bonjour à tous. aprés avoir eu de nombreux "problemme" avec les 72 minutes de limitation vidéo de MEGAVIDEO, j'ai décidé de faire un programme qui se
Pendu - Codeur interface graphique [ par Armanol ]
Bonjour, je suis Armanol, je suis programmeur en python. Je crée actuellement un pendu. Site (brièvement crée à l'occasion) : http://hitmanblog.x10.
suspend/load thread [ par stoner2008 ]
bonjour, j'ai un thread qui execute plusieurs instructions.j'aimerais bien faire une pause et reprendre mon thread de là ou je me suis arrêté.pour ce
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
974 Application Server (12.2.4.0)974 APPLICATION SERVER (12.2.4.0)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP mySongBook Player (1.0.0)MYSONGBOOK PLAYER (1.0.0)mySongBook Player est un logiciel gratuit permettant l'accès à une archive de tablatures/partitio... Cliquez pour télécharger mySongBook Player
|