99 lines
3.4 KiB
Python
99 lines
3.4 KiB
Python
import pygame
|
|
import sys
|
|
import math
|
|
import datetime
|
|
|
|
#Attribute der Uhr:---------------------------------------------------------------------------------
|
|
windowMargin = 30 #Abstand Uhr -> Fensterwand
|
|
windowWidth = 600
|
|
windowHeight = windowWidth
|
|
windowCenter = windowWidth/2, windowHeight/2
|
|
clockMarginWidth = 20
|
|
secondColor = (255,0,0)
|
|
minuteColor = (100,200,0)
|
|
hourColor = (100,200,0)
|
|
clockMarginColor = (130,130,0)
|
|
clockBackgroundColor = (20,40,30)
|
|
backgroundColor = (255,255,255)
|
|
hourCursorLength = windowWidth/2.0 - windowMargin -140
|
|
minuteCursorLength = windowWidth/2.0 - windowMargin - 40
|
|
secondCursorLength = windowWidth/2.0 - windowMargin - 10
|
|
|
|
virtualSpeed = 1
|
|
useVirtualTimer = False
|
|
|
|
pygame.init()
|
|
screen = pygame.display.set_mode((windowWidth, windowHeight), pygame.HWSURFACE | pygame.DOUBLEBUF)
|
|
pygame.display.set_caption('AnalogClock')
|
|
#Grundlegende Funktionen:---------------------------------------------------------------------------
|
|
|
|
#Funktion um die Position eines Zeiger zu ermitteln (0 Grad liegen auf 12 uhr!!!)
|
|
def getCursorPositionDegrees(position, scale):
|
|
#offset von -90 grad um 0 grad bei 12 uhr zu haben:
|
|
cursorOffset = -90
|
|
degrees = 360.0 / scale * position + cursorOffset
|
|
return degrees
|
|
|
|
#zur Umrechnung in Bogenmass:
|
|
def gradToBogenmass(degrees):
|
|
return degrees/180.0*math.pi
|
|
|
|
#endpunkte der Zeiger berechnen:
|
|
def getCirclePoint(position, scale, cursorLength):
|
|
degrees = getCursorPositionDegrees(position, scale)
|
|
bogenmass = gradToBogenmass(degrees)
|
|
xPos = round(math.cos(bogenmass)*cursorLength+windowCenter[0])
|
|
yPos = round(math.sin(bogenmass)*cursorLength+windowCenter[1])
|
|
return (xPos,yPos)
|
|
#Grafikfunktionen:----------------------------------------------------------------------------------
|
|
def drawBackground():
|
|
screen.fill(backgroundColor)
|
|
pygame.draw.ellipse(screen, clockMarginColor, (windowMargin, windowMargin, windowWidth-2*windowMargin, windowWidth-2*windowMargin))
|
|
pygame.draw.ellipse(screen, clockBackgroundColor,(windowMargin+clockMarginWidth/2,
|
|
windowMargin+clockMarginWidth/2, windowWidth-(windowMargin+clockMarginWidth/2)*2,
|
|
windowWidth-(windowMargin+clockMarginWidth/2)*2))
|
|
|
|
def drawForeground():
|
|
pygame.draw.ellipse(screen,clockMarginColor,(windowWidth/2.0-9, windowHeight/2.0-9, 18, 18))
|
|
|
|
def drawCursor(color, width, length, position, scale):
|
|
end = getCirclePoint(position, scale, length)
|
|
pygame.draw.line(screen, color, windowCenter, end, width)
|
|
|
|
def drawCurrentTime():
|
|
if useVirtualTimer:
|
|
global hour, minute, second, micro
|
|
timeGoesOn()
|
|
else:
|
|
now = datetime.datetime.now()
|
|
micro = now.microsecond
|
|
hour = now.hour
|
|
minute = now.minute
|
|
second = now.second
|
|
|
|
drawCursor(hourColor,15,hourCursorLength,hour+minute/60.0, 12)
|
|
drawCursor(minuteColor, 8, minuteCursorLength, minute+second/60.0, 60)
|
|
drawCursor(secondColor, 3, secondCursorLength, second+micro/1000000.0,60)
|
|
#Enventhandling:------------------------------------------------------------------------------------
|
|
def handleEvents():
|
|
for event in pygame.event.get():
|
|
if event.type == pygame.QUIT:
|
|
sys.exit(0)
|
|
elif event.type == pygame.KEYDOWN:
|
|
sys.exit(0)
|
|
#die Main:------------------------------------------------------------------------------------------
|
|
def main():
|
|
#Hauptschleife:
|
|
while True:
|
|
handleEvents()
|
|
screen.fill(backgroundColor)
|
|
|
|
drawBackground()
|
|
drawCurrentTime()
|
|
drawForeground()
|
|
|
|
pygame.display.flip()
|
|
pygame.time.delay(10)
|
|
|
|
if __name__ == '__main__':
|
|
main() |