Orologi analogici e digitali

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

Lascia un commento