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() #循环内的显示要不断地刷新,因为是动态的
python+pygame制作一个可自定义的动态时钟和详解的更多相关文章
- python+tkinter制作一个可自定义的动态时钟及详细解释,珍藏版
1.效果图 2.完整代码 #第1步:导出模块 from tkinter import * import math,time #第2步:定义窗口的相关设置 root = Tk() root.title( ...
- 关于IPB帧与恒定比特率、动态比特率的详解
之所以写这篇文章是因为有朋友对IPB帧的设置比较感兴趣,回复中说得比较简单,因此在这里详细的写一下,虽然说一般情况下我们很少去设置这个IPB帧,不过,如果真的学好了,并且清楚的了解了这个IPB帧的概念 ...
- 【VB技巧】VB静态调用与动态调用dll详解
本文“[VB技巧]VB静态调用与动态调用dll详解”,来自:Nuclear'Atk 网络安全研究中心,本文地址:http://lcx.cc/?i=489,转载请注明作者及出处! [[请注意]]:在以下 ...
- Java 反射 设计模式 动态代理机制详解 [ 转载 ]
Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...
- 第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解
第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解 信号一般使用信号分发器dispatcher.connect(),来设置信号,和信号触发函数,当捕获到信号时执行 ...
- 【转】java的动态代理机制详解
java的动态代理机制详解 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们 ...
- java的动态代理机制详解-----https://www.cnblogs.com/xiaoluo501395377/p/3383130.html
java的动态代理机制详解-----https://www.cnblogs.com/xiaoluo501395377/p/3383130.html
- Flask学习之旅--用 Python + Flask 制作一个简单的验证码系统
一.写在前面 现在无论大大小小的网站,基本上都会使用验证码,登录的时候要验证,下载的时候要验证,而使用的验证码也从那些简简单单的字符图形验证码“进化”成了需要进行图文识别的验证码.需要拖动滑块的滑动验 ...
- 使用pygame制作一个简单的游戏
翻译自Will McGugan的<Beginning Game Development with Python and Pygame –From Novice to Professional&g ...
随机推荐
- 【你不知道的javaScript 上卷 笔记6】javaScript中的对象相关内容
一.创建一个对象的语法 var myObj = { key: value // ... };//字面量 var myObj = new Object(); //new myObj.key = valu ...
- Day5 多线程 锁
synchronized保证操作原子性 这是因为对变量进行读取和写入时,结果要正确,必须保证是原子操作.原子操作是指不能被中断的一个或一系列操作. 通过加锁和解锁的操作,就能保证3条指令总是在一个线程 ...
- 【NOIP2011提高组】计算系数
计算系数 算法:真·滚动数组模拟!!! 马上CSP/S了,这是远在今年暑假前的一天的校内考试题中的一道.当时做的时候不会组合数,不会二项式定理,不会DP,不会……只知道应该n*n的空间存一个杨辉三角形 ...
- jdbc中SQL语句拼接java变量
例如:String sql = "select * from user where username='" + username + "' and password =' ...
- SequoiaDB报告创建线程失败的解决办法
1.问题背景 对于分布式数据库和分布式环境,高并发和高性能压力的情况下,出现线程创建失败等等问题也是十分常见的,这时候就十分考虑数据库管理员的经验,需要能快速的定位到问题和瓶颈所在,快速解决.本文也是 ...
- 打表法fffff
打表法: 打表前先运行一下 看一看速度 优化: O3 #pragma GCC optimize(3,"Ofast","inline") O2 #pragma ...
- shell内置命令和外部命令的区别
内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留 ...
- CentOS7.5升级OpenSSH
实验环境 OS:CentOS 7.5 当前openssh版本:OpenSSH_7.4p1 升级后的openssh版本:OpenSSH_8.0p1 开通telnet 为了防止升级过程中ssh断连,保险起 ...
- Idea实用小Tips
设置keymap 自己根据习惯选择keymap(键位) 插件安装 ###省去set.get方法以及基于注解的日志框架 lombok plugin ###找bug用的 FindBugs-IDEA ### ...
- Python获取最新电影的信息
这次将从电影天堂获取最新的电影的详细信息,这里电影的信息罗列的比较详细. 本来只是想获取电影的迅雷链接,然后用迅雷去下载.但看到这里的电影的信息比较完整和详细,忍不住把所有信息都爬取下来了. 下图是& ...