python+pygame制作一个可自定义的动态时钟和详解

1.效果图

2.完整代码

#第1步:导出模块
import sys, random, math, pygame
from pygame.locals import *
from datetime import datetime, date, time

#第2步:初始化和窗扣大小的设置
pygame.init() #这一步必须放在模块之后,对pygame很重要
#screen = pygame.display.set_mode((800, 600)) #定义窗口大小
screen = pygame.display.set_mode((1500, 1000),RESIZABLE,0,32)
‘‘‘
set_mode(size =(0,0),flags = 0,depth = 0)
默认flags = 0,depth = 32
size:(0,0)参数是一对表示宽度和高度的数字
depth:参数表示用于颜色的位数(通常最好不要传递深度参数。它将默认为系统的最佳和最快颜色深度),默认32,一般8~32
flags:参数控制您想要的显示类型。
有几种可供选择,您甚至可以使用按位或运算符(管道“|”字符)组合多种类型。
如果传递0或没有flags参数,它将默认为软件驱动的窗口。
FULLSCREEN=全屏,小程序不建议,大型游戏可以考虑;RESIZABLE=窗口可调节大小,不设置就是不能调节窗口大小
‘‘‘
pygame.display.set_caption("动态时钟DIY") #定义标题

#第3步:字体设置
#font = pygame.font.Font(None, 36) #定义字体,注意如果是中文字体,需要额外设置
#如果游戏界面内有中文,比如‘分数’等显示时,需要设置中文,可以指定字体和路径,如下本机设置
font = pygame.font.Font(‘/home/xgj/Desktop/simsun/simsun.ttf‘, 36)  #显示中文的设置和字体,及路径

#第4步:颜色设置
#pygame中的颜色采用RGB数值,故定义颜色名称=具体数值,会使代码简洁
#当然也可以直接写数值,比如caogreen=0, 100, 100
orange = 220, 180, 0
white = 255, 255, 255
yellow = 255, 255, 0
pink = 255, 100, 100
caogreen=0, 100, 100  #草绿色
deepskyblue=30,144,255
black=0,0,0

#第5步:定义全局变量
px=700 #px=pos_x=初始的x位置,也就是水平移动700,从左往中间(右→)移动
py=250 #250就是时钟的圆点距离顶格水平线的距离=半径radius=250
radius = 250
angle = 360 #一圈正好360°

‘‘‘
注意:曾在本机python3.8报错,下面有注释和改进后的说明
DeprecationWarning: an integer is required (got type float).
Implicit conversion to integers using __int__ is deprecated,
and may be removed in a future version of Python.
报错的bug1、2、3的原因是target元组里的数是float,需要转换成int整数
‘‘‘

#第6步:定义打印文字print_text,可多次使用,依次放置,注意位置,后面有举例
#def print_text(font, x, y, text, color=(255, 255, 255)):
#这里设置了打印字体的颜色了,后面再单独设置就不行,除非自己再单独定义函数print_text2
def print_text(font, x, y, text, color=white):
    imgText = font.render(text, True, white)
    #screen.blit(imgText,x,y) #报错,修改前
    screen.blit(imgText, (int(float(x)),int(float(y))))  #bug0,修改后,将float转换成int,改进了,搞定了

#第7步:定义绑定的角度
def wrap_angle(angle):
    return angle % 360

#第8步:循环定义,必须必的
while True:
    #退出循环的方法有2种
    #方法一
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
    #方法二
    keys = pygame.key.get_pressed()
    if keys[K_ESCAPE]:
        sys.exit()

    #定义屏幕背景颜色=填充颜色
    #screen.fill((0, 100, 100)) #直接数值法,代码显得繁琐
    screen.fill(deepskyblue)

    #画圈,屏幕上,粉红色圈线,位置,半径,粗细为6
    pygame.draw.circle(screen, pink, (px, py), radius, 6)

    for n in range(1, 13): #定义时钟上面的1~12的小时刻度
        angle = math.radians(n * (360 / 12) - 90) #角度
        x = math.cos(angle) * (radius - 20) - 10  #x坐标
        y = math.sin(angle) * (radius - 20) - 10  #y坐标
        print_text(font, px + x, py + y, str(n))  #打印出来

    #获取今天的时间
    today = datetime.today()
    #定义年月日
    years=today.year
    months=today.month
    days=today.day
    #定义时分秒
    #hours = today.hour % 12 #显示12h制
    hours = today.hour % 24 #显示24h制
    minutes = today.minute
    seconds = today.second

    #定义时针
    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 = (px + hour_x, py + hour_y) #修改前的bug
    target = (int(float(px + hour_x)), int(float(py + hour_y)))    #修改后,将float转换成int
    pygame.draw.line(screen, pink, (px, py), target, 12)    #本来bug1,后来不提示;时针设置,粉红色

    #定义分针
    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 = (px + min_x, py + min_y)  #修改前的bug
    target = (int(float(px + min_x)), int(float(py + min_y)))   #修改后,将float转换成int
    pygame.draw.line(screen, orange, (px, py), target, 6)    #本来bug2,后来不提示,秒针设置,橘色

    #定义秒针
    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 = (px + sec_x, py + sec_y)  #修改前的bug
    target = (int(float(px + sec_x)), int(float(py + sec_y)))   #修改后,将float转换成int
    pygame.draw.line(screen, black, (px, py), target, 3) #本来提示bug3,后来不提示;分针设置,黄色

    pygame.draw.circle(screen, white, (px, py), 20) #钟面中心的圆点设置,白色,粗20
    #显示当前时间,x=400,y=550,为坐标
    print_text(font, 400, 550, ‘当前时间:‘+str(years) +‘年‘+str(months) +‘月‘+str(days)
    +‘日‘+str(hours) +‘时‘+ ":" + str(minutes) + ‘分‘+":" + str(seconds)+‘秒‘)
    print_text(font,400,600,‘上联:火神山、雷神山、钟南山,三座大山镇魔妖‘)
    print_text(font,400,650,‘下联:军民心、医护心、爱国心,万众一心战新冠‘)
    print_text(font,400,700,‘横批:庚子新冠‘)
    pygame.display.update() #循环内的显示要不断地刷新,因为是动态的

原文地址:https://www.cnblogs.com/ysysbky/p/12254600.html

时间: 2024-10-30 22:17:22

python+pygame制作一个可自定义的动态时钟和详解的相关文章

python+tkinter制作一个可自定义的动态时钟及详细解释,珍藏版

1.效果图 2.完整代码 #第1步:导出模块 from tkinter import * import math,time #第2步:定义窗口的相关设置 root = Tk() root.title("a DIY clock") #定义窗口名称 root.geometry("1020x800+500+0") #位置坐标=500,0=就是顶格向右水平移动500 root.configure(bg='pink') #定义窗口的背景颜色 #第3步:定义全局变量 globa

关于IPB帧与恒定比特率、动态比特率的详解

之所以写这篇文章是因为有朋友对IPB帧的设置比较感兴趣,回复中说得比较简单,因此在这里详细的写一下,虽然说一般情况下我们很少去设置这个IPB帧,不过,如果真的学好了,并且清楚的了解了这个IPB帧的概念和设置后,我们能够在渲染成品的时候更加好的掌控视频的质量与体积. 在说怎么设置之前,我们先了解一下IPB帧的概念,网络上其实蛮多的,我这里稍微做一点自己的改变和理解,这样更加方便我们理解. 首先说到IPB帧,就不得不说一下帧内压缩和帧间压缩:关于压缩,我想不需要做更多的解释,简单点,就是为了在保证我

第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解

第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲-scrapy信号详解 信号一般使用信号分发器dispatcher.connect(),来设置信号,和信号触发函数,当捕获到信号时执行一个函数 dispatcher.connect()信号分发器,第一个参数信号触发函数,第二个参数是触发信号, signals.engine_started当Scrapy引擎启动爬取时发送该信号.该信号支持返回deferreds.signals.engine_stopped当Scrapy引擎停止时发送

ant-design-pro 动态菜单-路由详解

ant-design-pro 动态菜单-路由详解最近利用ant-design-pro开发项目要实现之前的项目嵌入到新项目里来,并且根据和后台的接口返回的数据显示侧边栏菜单.既然是是利用别人的架构那当然是从文档中找实现的方法,终于不负苦心人在https://pro.ant.design/docs/router-and-nav-cn文档那里找到初步的解决方法 进入src/layouts/Basilayout.js在官网中直接复制该代码,将原文件替换.现在正式进入正题. 1,在src/layouts/

好程序员Java教程Java动态代理机制详解

好程序员Java教程Java动态代理机制详解:在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的.首先我们先来看看java的API帮助文档是怎么样对这两个类进行描述的: InvocationHandler: 1InvocationHandler is the interface implemented by the invocation handle

STL中map容器使用自定义key类型报错详解

引言 STL的map容器中,key的类型是不是随意的呢? 实践 编写测试代码 定义一个结构体来试试: struct a { char* pName; int m_a; }; map<a, int> mp; a a1; a1.m_a = 100; a1.pName = "a1"; a a2; a2.m_a = 200; a2.pName = "a2"; mp.insert(std::make_pair(a1, 1)); mp.insert(std::mak

Android中自定义View、ViewGroup理论基础详解

Android自身提供了许多widgets,但是有时候这些widgets并不能满足我们的需求,这时我们就需要自定义View,本文会详细说明自定义View的各种理论基础,只有理解了这些知识,我们才能更好地实现各种功能的控件. 我觉得自定义View中最重要的部分就是绘图和交互,自定义的绘图使得你的View与众不同,交互使用户可以与你的View进行交互,而绘图的前提是View的量算与布局,交互的基础是触摸事件,所以量算.布局.绘图.触摸事件这些是自定义View的核心. 除此之外,一个设计友好的自定义V

一个神秘的PHP一句话后门代码详解

神秘的一句话后门代码内容: <?php    @$_++;  $__=("#"^"|");$__.=("."^"~");$__.=("/"^"`");$__.=("|"^"/");$__.=("{"^"/");  ${$__}[!$_](${$__}[$_]); ?> 代码作用: 以上代码即是PH

代理设计模式之静态代理与动态代理(超..)详解

在学习Spring框架的时候,有一个重要的思想就是AOP,面向切面编程,利用AOP的思想结合Spring的一些API可以实现核心业务与辅助业务的分离,即可以在执行核心业务时,将一些辅助的业务加进来,而辅助业务(如日志,权限控制等)一般是一些公共业务,这样就实现了两者的分离,使得核心业务的代码更加纯粹,而且辅助业务也能得到复用,这一篇笔记是当时学习spring的时候写的,使用springAPI以及自定义类 实现AOP的一个例子 ,.AOP底层就是通过动态代理来实现的,最近专门学习了一下代理模式,反