Python | 写了个钟&

图文编辑:逻辑熊猫 图片来源:网络与截图 欢迎朋友圈各种姿势转发

一个软件的关键在于,你想用它做什么!

概述:

  • 显示时间的钟表
  • 使用pygame模块
  • 使用time、sys、math模块

一、展示

二、代码:

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

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

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

# main program begins
pygame.init()
screen = pygame.display.set_mode((600, 500))
pygame.display.set_caption("Analog Clock Demo")
font = pygame.font.Font(None, 24)
orange = 200, 180, 0
white = 255, 255, 255
yellow = 255, 255, 0
pink = 255, 100, 100

pos_x = 300
pos_y = 250
radius = 250
angle = 360

# repeating loop
while True :
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
    keys = pygame.key.get_pressed()
    if keys[K_ESCAPE]:
        screen.fill((0, 0, 100))
        sys.exit()

    # draw the clock numbers 1-12
    for n in range(1, 13):
        angle = math.radians(n * (360 / 12) - 90)
        x = math.cos(angle) * (radius - 20) - 10
        y = math.sin(angle) * (radius - 20) - 10
        print_text(font, pos_x + x, pos_y + y, str(n))

    # get the time of day
    today = datetime.today()
    hours = today.hour
    minutes = today.minute
    seconds = today.second

    # draw the hours hand
    hour_angle = wrap_angle(hours * (360 / 12) - 90)
    hour_angle = math.radians(hour_angle)
    hour_x = math.cos(hour_angle) * (radius - 80)
    hour_y = math.sin(hour_angle) * (radius - 80)
    target = (pos_x + hour_x, pos_y + hour_y)
    pygame.draw.line(screen, pink, (pos_x, pos_y), target, 25)

    # draw the minute hand
    min_angle = wrap_angle(minutes * (360 / 60) - 90)
    min_angle = math.radians(min_angle)
    min_x = math.cos(min_angle) * (radius - 60)
    min_y = math.sin(min_angle) * (radius - 60)
    target = (pos_x + min_x, pos_y + min_y)
    pygame.draw.line(screen, orange, (pos_x, pos_y), target, 12)
    
    # draw the second hand
    sec_angle = wrap_angle(seconds * (360 / 60) - 90)
    sec_angle = math.radians(sec_angle)
    sec_x = math.cos(sec_angle) * (radius - 40)
    sec_y = math.sin(sec_angle) * (radius - 40)
    target = (pos_x + sec_x, pos_y + sec_y)
    pygame.draw.line(screen, yellow, (pos_x, pos_y), target, 6)

    # cover the center
    pygame.draw.circle(screen, white, (pos_x, pos_y), radius, 6)
    pygame.draw.circle(screen, white, (pos_x, pos_y), 20)
    print_text(font, 0, 0, str(hours) + " : " + str(minutes) + " : " + str(seconds))
    
    pygame.display.update()
    screen.fill((0,0,0))

三、代码讲解

关于颜色:可在此处修改颜色信息

orange = 200, 180, 0
white = 255, 255, 255
yellow = 255, 255, 0
pink = 255, 100, 100

获取系统时间

# get the time of day
    today = datetime.today()
    hours = today.hour
    minutes = today.minute
    seconds = today.second

定位指针

# draw the hours hand
   hour_angle = wrap_angle(hours * (360 / 12) - 90)
   hour_angle = math.radians(hour_angle)
   hour_x = math.cos(hour_angle) * (radius - 80)
   hour_y = math.sin(hour_angle) * (radius - 80)
   target = (pos_x + hour_x, pos_y + hour_y)
   pygame.draw.line(screen, pink, (pos_x, pos_y), target, 25)

   # draw the minute hand
   min_angle = wrap_angle(minutes * (360 / 60) - 90)
   min_angle = math.radians(min_angle)
   min_x = math.cos(min_angle) * (radius - 60)
   min_y = math.sin(min_angle) * (radius - 60)
   target = (pos_x + min_x, pos_y + min_y)
   pygame.draw.line(screen, orange, (pos_x, pos_y), target, 12)
   
   # draw the second hand
   sec_angle = wrap_angle(seconds * (360 / 60) - 90)
   sec_angle = math.radians(sec_angle)
   sec_x = math.cos(sec_angle) * (radius - 40)
   sec_y = math.sin(sec_angle) * (radius - 40)
   target = (pos_x + sec_x, pos_y + sec_y)
   pygame.draw.line(screen, yellow, (pos_x, pos_y), target, 6)

四、笔者自述

这是一个模拟时钟软件。实现原理是利用time模块获取系统时间,然后利用pygame模块强大的图形处理能力,将时间变成钟表样式。这中间需要用到数学模块。

Pygame是一个为2D小游戏开发的模块,使用这个模块可以帮助开发者,快速,独立地开发具有可玩性的游戏。但是一个其用途并不局限于游戏开发,其优秀的图形图像,音频处理能力,让它可以适用于更多场合。

整体思路,建立一个画布,在上面画好一个时钟的轮轮廓。外边的大圆和圆心。之后画好时钟的指针(时针、分针、秒针),再利用math模块提供的数学函数,计算出指针旋转的角度。一个时钟就这样完成了。

五、结尾

功能简介:领域包括了「面向 Python 基础,进阶和有趣应用」的一站式技术分享,挖掘学习者在学习当中遇到的各类问题并分享经验,关注实用技能和有趣新闻,感兴趣的推荐关注。

原文发布于微信公众号 - 逻辑熊猫带你玩Python(LogicPanda)

原文发表时间:2018-05-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏HansBug's Lab

【作业4.0】HansBug的第四次面向对象课程思考

11830
来自专栏PPV课数据科学社区

回顾R和微软过去的一年

托马斯·斯莫尔的ML / DL博客最近回顾了数据科学,机器学习和深度学习显著的进步-其中许多涉及R和/或微软。以下是他们的亮点: R Project R和Pyt...

33350
来自专栏数说工作室

绘制人口热点地图的N种方法 | 数友讨论

前天发了一个数友的求助 想做一个区域的特征人口热点地图。什么软件或者平台,可以自行导入数据,做一个类似人口热点的地图。 由于留言过48小时不能再回复,猜测应该类...

52950
来自专栏Crossin的编程教室

【Pygame 第2课】 游戏的本质

你小时候有没有玩过这样一种玩具:一块硬纸,一面画着一只鸟,一面画着一个笼子。硬纸下粘上一根细棒。用手来回转动细棒,让硬纸的两面快速交替出现,就会看见鸟被关在了笼...

31960
来自专栏老九学堂

论开发者最讨厌的编程语言竟然是...

看过许多最受欢迎的编程语言榜单,但小伙伴们知道开发者最想规避的语言是什么吗?Stack Overflow 近日发布了一些数据,试图找出最不受欢迎的编程语言。 下...

47960
来自专栏CDA数据分析师

为什么75%的数据科学家使用R做数据分析?

作者   CDA 数据分析师 数据科学家被认为是21世纪最性感也是最具发展前景的职业,目前有75%左右的数据科学家使用R语言,有35%左右的数据科学家将R语言作...

28390
来自专栏程序人生

那些年,我追过的绘图工具

文档能力是一个工程师必不可少的基础能力,而高质量的文档往往伴随着高质量的图表。"A picture is worth a thousand words",复杂的...

45260
来自专栏华章科技

一件有趣的事:我用 Python 爬了爬自己的微信朋友

安装完成后导入包,再登陆自己的微信。过程中会生产一个登陆二维码,扫码之后即可登陆。登陆成功后,把自己好友的相关信息爬下来。

11330
来自专栏玉树芝兰

帮你偷懒的靠谱幻灯工具

PPT是微软办公软件PowerPoint的文件扩展名。因为大家做幻灯都习惯了用PowerPoint,所以渐渐地就把“幻灯”和“PPT”混为一谈了。

10440
来自专栏华章科技

12个数据可视化工具,人人都能做出超炫图表

导语:今天我们带来一篇来自 Adobe 工程师 Rohit Boggarapu 的文章。他在文章中介绍了一些适合网页开发者的数据可视化和绘图工具,让你不必再花大...

16130

扫码关注云+社区

领取腾讯云代金券