Lancetta e numero di secondi
import math
import time
import pygame
TITOLO="Orologio analogico e digitale: secondi"
DIM =800
FRAME =5
RaSecondi=0.4*DIM
raSecondi=0.02*DIM
coSfondo =(127, 127, 127)
coSecondi1=( 64, 0, 0)
coSecondi2=(255, 0, 0)
frSecondi=2*math.pi/60
PI2 =math.pi/2
W2 =DIM/2
H2 =DIM/2
CENTRO=(W2, H2)
pygame.init()
screen=pygame.display.set_mode((DIM, DIM))
FONT =pygame.font.SysFont("Courier", size=40)#, bold=True)
clock =pygame.time.Clock()
pygame.display.set_caption(TITOLO)
ANCORA=True
while ANCORA:
# CONTROLLO DEGLI EVENTI
for event in pygame.event.get():
if(event.type == pygame.QUIT):
ANCORA=False
t=time.localtime(time.time())
secondi=t.tm_sec
anSecondi = frSecondi * secondi
anSecondi -= PI2
cosSecondi = math.cos(anSecondi)
sinSecondi = math.sin(anSecondi)
poSecondi1 = (W2+RaSecondi*cosSecondi, H2+RaSecondi*sinSecondi)
poSecondi2 = (W2-RaSecondi*cosSecondi, H2-RaSecondi*sinSecondi)
screen.fill(coSfondo)
pygame.draw.circle(screen, coSecondi1, CENTRO , RaSecondi)
pygame.draw.circle(screen, coSecondi2, CENTRO , RaSecondi, width=1)
pygame.draw.circle(screen, coSecondi2, poSecondi1, raSecondi)
pygame.draw.aaline(screen, coSecondi2, poSecondi1, poSecondi2)
strSecondi="%02i" %(secondi)
TEXT =FONT.render(strSecondi, 1, (255,255,255))
textpos=TEXT.get_rect()
textpos.center=screen.get_rect().center
screen.blit(TEXT, textpos)
pygame.display.flip()
clock.tick(FRAME)
pygame.quit()
Le tre lancette e l’orario completo
import math
import time
import pygame
TITOLO="Orologio analogico e digitale"
DIM =800
FRAME =5
RaOre =0.2*DIM
RaMinuti =0.3*DIM
RaSecondi=0.4*DIM
raOre =0.04*DIM
raMinuti =0.03*DIM
raSecondi=0.02*DIM
coSfondo =(127, 127, 127)
coOre1 =( 0, 0, 64)
coMinuti1 =( 0, 64, 0)
coSecondi1=( 64, 0, 0)
coOre2 =( 0, 0, 255)
coMinuti2 =( 0, 255, 0)
coSecondi2=(255, 0, 0)
frSecondi=2*math.pi/60
frMinuti =2*math.pi/60
frOre =2*math.pi/12
PI2 =math.pi/2
W2 =DIM/2
H2 =DIM/2
CENTRO=(W2, H2)
pygame.init()
screen=pygame.display.set_mode((DIM, DIM))
FONT =pygame.font.SysFont("Courier", size=40)#, bold=True)
clock =pygame.time.Clock()
pygame.display.set_caption(TITOLO)
ANCORA=True
while ANCORA:
# CONTROLLO DEGLI EVENTI
for event in pygame.event.get():
if(event.type == pygame.QUIT):
ANCORA=False
t=time.localtime(time.time())
ore =t.tm_hour
minuti =t.tm_min
secondi=t.tm_sec
anSecondi=frSecondi * secondi
anMinuti =frMinuti * (minuti + secondi/60)
anOre =frOre * (ore + minuti /60)
anSecondi -= PI2
anMinuti -= PI2
anOre -= PI2
cosOre =math.cos(anOre ); sinOre =math.sin(anOre )
cosMinuti =math.cos(anMinuti ); sinMinuti =math.sin(anMinuti )
cosSecondi=math.cos(anSecondi); sinSecondi=math.sin(anSecondi)
poOre1 =(W2+RaOre *cosOre , H2+RaOre *sinOre )
poMinuti1 =(W2+RaMinuti *cosMinuti , H2+RaMinuti *sinMinuti )
poSecondi1=(W2+RaSecondi*cosSecondi, H2+RaSecondi*sinSecondi)
poOre2 =(W2-RaOre *cosOre , H2-RaOre *sinOre )
poMinuti2 =(W2-RaMinuti *cosMinuti , H2-RaMinuti *sinMinuti )
poSecondi2=(W2-RaSecondi*cosSecondi, H2-RaSecondi*sinSecondi)
screen.fill(coSfondo)
pygame.draw.circle(screen, coSecondi1, CENTRO , RaSecondi)
pygame.draw.circle(screen, coSecondi2, CENTRO , RaSecondi, width=1)
pygame.draw.circle(screen, coSecondi2, poSecondi1, raSecondi)
pygame.draw.aaline(screen, coSecondi2, poSecondi1, poSecondi2)
pygame.draw.circle(screen, coMinuti1, CENTRO , RaMinuti)
pygame.draw.circle(screen, coMinuti2, CENTRO , RaMinuti, width=1)
pygame.draw.circle(screen, coMinuti2, poMinuti1, raMinuti)
pygame.draw.aaline(screen, coMinuti2, poMinuti1, poMinuti2)
pygame.draw.circle(screen, coOre1, CENTRO, RaOre)
pygame.draw.circle(screen, coOre2, CENTRO, RaOre, width=1)
pygame.draw.circle(screen, coOre2, poOre1, raOre)
pygame.draw.aaline(screen, coOre2, poOre1, poOre2)
strOrario="%02i:%02i:%02i" %(ore,minuti,secondi)
#print(strOrario)
TEXT =FONT.render(strOrario, 1, (255,255,255))
textpos=TEXT.get_rect()
textpos.center=screen.get_rect().center
screen.blit(TEXT, textpos)
pygame.display.flip()
clock.tick(FRAME)
pygame.quit()
Il codice per tre lancette è diventato molto ripetitivo, è il momento di utilizzare le classi!
import math
import time
import pygame
#----------------------------------------------------------------------------------------
pygame.init()
TITOLO="Orologio analogico e digitale"
DIM =800
FRAME =5
W2 =DIM/2
H2 =DIM/2
PI2 =math.pi/2
SFONDO=(127, 127, 127)
SCREEN=pygame.display.set_mode((DIM, DIM))
CLOCK =pygame.time.Clock()
pygame.display.set_caption(TITOLO)
#----------------------------------------------------------------------------------------
class Lancetta():
def __init__(self, intervallo, xc,yc, raggio1,raggio2, colore1,colore2):
self.frazione =2*math.pi/intervallo
self.xc =xc
self.yc =yc
self.raggio1 =raggio1
self.raggio2 =raggio2
self.colore1 =colore1
self.colore2 =colore2
self.posizione1=0
self.posizione2=0
def aggiorna(self, delta):
angolo=self.frazione*delta-PI2
coseno=math.cos(angolo)
seno =math.sin(angolo)
self.posizione1=(self.xc+self.raggio1*coseno, self.yc+self.raggio1*seno)
self.posizione2=(self.xc-self.raggio1*coseno, self.yc-self.raggio1*seno)
def disegna(self):
pygame.draw.circle(SCREEN, self.colore1, (self.xc,self.yc), self.raggio1)
pygame.draw.circle(SCREEN, self.colore2, (self.xc,self.yc), self.raggio1, width=1)
pygame.draw.circle(SCREEN, self.colore2, self.posizione1, self.raggio2)
pygame.draw.aaline(SCREEN, self.colore2, self.posizione1, self.posizione2)
#----------------------------------------------------------------------------------------
class Orario():
def __init__(self, colore, dimensione):
self.colore =colore
self.FONT =pygame.font.SysFont("Courier", size=dimensione)
self.strOrario=""
self.textpos =0
self.TEXT =0
def aggiorna(self, ore, minuti, secondi):
self.strOrario="%02i:%02i:%02i" %(ore,minuti,secondi)
self.TEXT=self.FONT.render(self.strOrario, 1, self.colore)
self.textpos=self.TEXT.get_rect()
self.textpos.center=SCREEN.get_rect().center
def disegna(self):
SCREEN.blit(self.TEXT, self.textpos)
#----------------------------------------------------------------------------------------
lancettaOre =Lancetta(12, W2, H2, 0.2*DIM, 0.04*DIM, (0,0,64), (0,0,255))
lancettaMinuti =Lancetta(60, W2, H2, 0.3*DIM, 0.03*DIM, (0,64,0), (0,255,0))
lancettaSecondi=Lancetta(60, W2, H2, 0.4*DIM, 0.02*DIM, (64,0,0), (255,0,0))
orario =Orario((255,255,255), 40)
#----------------------------------------------------------------------------------------
ANCORA=True
while ANCORA:
#------------------------------------------------------
for event in pygame.event.get():
if(event.type == pygame.QUIT):
ANCORA=False
#------------------------------------------------------
t=time.localtime(time.time())
ore =t.tm_hour
minuti =t.tm_min
secondi=t.tm_sec
#------------------------------------------------------
lancettaSecondi.aggiorna(secondi)
lancettaMinuti.aggiorna(minuti+secondi/60)
lancettaOre.aggiorna(ore+minuti/60+secondi/3600)
orario.aggiorna(ore,minuti,secondi)
#------------------------------------------------------
SCREEN.fill(SFONDO)
lancettaSecondi.disegna()
lancettaMinuti.disegna()
lancettaOre.disegna()
orario.disegna()
pygame.display.flip()
CLOCK.tick(FRAME)
#------------------------------------------------------
pygame.quit()
Prova a cambiare i parametri alla chiamata degli oggetti lancetta e orario