# pygame实现时钟效果

### 开始下手

```import math, pygame
from pygame.locals import *
from datetime import datetime, date, time

pygame.init()
screen = pygame.display.set_mode((600, 600))
pygame.display.set_caption("Clock")```

```pos_x = 300
pos_y = 300

```white = 255, 255, 255
red = 240, 0, 0
green = 0, 240, 0
blue = 0, 0, 240```

```hour_angle = 0
minute_angle = 0
second_angle = 0```

`font = pygame.font.Font(None, 24)`

```# abs（）是取绝对值，%运算符号很有意思，效果是360取余数，保证了角度在360以内
def wrap_angle(angle):
return abs(angle % 360)

# 把打印文字的步骤封装在一个方法里，每次方便调用，简化代码
def print_text(font, x, y, text, color):
imgText = font.render(text, True, color)
screen.blit(imgText, (x, y))```

```while True:
for event in pygame.event.get():
if event.type == QUIT:
exit()编程客栈
keys = pygame.key.get_pressed()
if keys[K_ESCAPE]:
exit()```

`screen.fill((131, 139, 139))`

```# 画表盘
pygame.draw.circle(screen, white, (pos_x, pos_y), radius, 2)```

```# 写表盘数字
for n in range(1, 13):
# 一共12个数字，平均分到一个圆内 每两个数字之间的角度为 360/12
print_text(font, pos_x + x, pos_y + y, str(n), white)```

range（x,y）

math.randians(angle)、math.sin()、math.cos()

```# 获取时间
time = datetime.today()
hour = time.hour % 12
minute = time.minute
second = time.second```

```# 画秒针
second_angle = wrap_angle(second * (360 / 60) - 90)  # 秒针是60进制，所以一秒的角度为 360/60
pygame.draw.line(screen, blue, (pos_x, pos_y), (pos_x + second_x, pos_y + second_y), 2)```

```# 画分针
minute_angle = wrap_angle(minute * (360 / 60) - 90)  # 分针也是60进制，原理同秒针
pygame.draw.line(screen, green, (pos_x, pos_y), (pos_x + minute_x, pos_y + minute_y), 4)
# 画时针
# 时针算角度时增加了一部分，因为钟表分针走的时候，时针也在走一个很小的角度 即30/60，
# 加上这个角度，表才更加逼真，否则分针走的时候，时针一直保持指到整点，是错误的
hour_angle = wrap_angle(hour * (360 / 12) - 90) + minute * 30 / 60
pygame.draw.line(screen, red, (pos_x, pos_y), (pos_x + hour_x, pos_y + hour_y), 6)```

```# 写时间
print_text(font, 10, 10, str(hour) + " : " + str(minute) + " : " + str(second), white)```

```# 画表中心的圆点 之所以放在最后是想盖住三个针的原点
pygame.draw.circle(screen, white, (pos_x, pos_y), 8, 0)```

`pygame.display.update()`

```import math, pygame
from pygame.locals import *
from datetime import datetime, date, time

pygame.init()
screen = pygame.display.set_mode((600, 600))
pygame.display.set_caption("Clock")

pos_x = 300
pos_y = 300

white = 255, 255, 255
red = 240, 0, 0
green = 0, 240, 0
blue = 0, 0, 240

hour_angle = 0
minute_angle = 0
second_angle = 0

font = pygame.font.Font(None, 24)

def wrap_angle(angle):
return abs(angle % 360)

def print_text(font, x, y, text, color):
imgText = font.render(text, True, color)
screen.blit(imgText, (x, y))

while True:
for event in pygame.event.get():
if event.type == QUIT:
exit()
keys = pygame.key.get_pressed()
if keys[K_ESCAPE]:
exit()

screen.fill((131, 139, 139))

# 画表盘
pygame.draw.circle(screen, white, (pos_x, pos_y), radius, 2)

# 写表盘数字
for n in range(1, 13):  # range(x,y)是从x开始到y结束 但不包括y编程客栈，所以这里是1-13
# 一共12个数字，平均分到一个圆内 每两个数字之间的角度为 360/12
# 减90是因为默认开始点是3点钟方向，而实际上是12点钟方向，下面画分针、时针、秒针时也是这个道理
angle = n * 360 / 12 - 90
# 这里x,y减5减7，是因为写文字的时候坐标不是文字的中心点而是文字的左上角
# ，所以文字会显得往右下角偏，稍微的修正看起来更舒服
print_text(font, pos_x + x, pos_y + y, str(n), white)

# 获取时间
time = datetime.today()
hour = time.hour % 12
minute = time.minute
second = time.second

# 画秒针
second_angle = wrap_angle(second * (360 / 60) - 90)  # 秒针是60进制，所以一秒的角度为 360/60
pygame.draw.line(screen, blue, (pos_x, pos_y), (pos_x + second_x, pos_y + second_y), 2)
# 画分针
minute_angle = wrap_angle(minute * (360 / 60) - 90)  # 分针也是60进制，原理同秒针
pygame.draw.line(screen, green, (pos_x, pos_y), (pos_x + minute_x, pos_y + minute_y), 4)
# 画时针
# 时针算角度时增加了一部分，因为钟表分针走的时候，时针也在走一个很小的角度 即30/60，
# 加上这个角度，表才更加逼真，否则分针走的时候，时针一直保持指到整点，是错误的
hour_angle = wrap_angle(hour * (360 / 12) - 90) + minute * 30 / 60
pygame.draw.line(screen, red, (pos_x, pos_y), (pos_x + hour_x, pos_y + hour_y), 6)

# 写时间
print_text(font, 10, 10, str(hour) + " : " + str(minute) + " : " + str(second), white)

# 画表中心的圆点 之所以放在最后是想盖住三个针的原点
pygame.draw.circle(screen, white, (pos_x, pos_y), 8, 0)

pygame.display.update()```