news 2026/2/9 7:46:33

零基础:100个小案例玩转Python软件开发!第六节:电子钟

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
零基础:100个小案例玩转Python软件开发!第六节:电子钟

大家好,欢迎继续观看系列专栏《零基础:100个小案例玩转Python软件开发!》!在这个系列里,我们不讲枯燥的理论,只玩最酷的Python案例实战。

本节课我们来学习一下如何制作电子钟,为什么要讲解电子钟的制作呢?因为这个案例涉及到两个知识点:

  1. 画布绘图的方法和函数。

  2. 定时器组件的使用。

具体如何做呢?下面我们来学习一下吧~!

一、表盘的制作

首先我们创建一个PyMe项目“Clock”,调整Form的大小,然后从顶部的绘制图形右边的绘制钟表背景圆。

选中圆形,然后在Form中拖动生成一个椭圆形(横向宽一点),并设置背景色为深灰色。

再次拖动创建一个圆形,设置背景色也是深灰色,但有一个白色边框,放置在椭圆之上,这样可以增强表盘的立体感。

在这个过程中,我们可以把底下的椭圆形通过鼠标右键的菜单项“锁定图形”以防止图形被误操作移动。操作完后可以把上面的圆形表盘也锁定。

有了表盘后,下面我们要准备一个与之大小合适的表盘上圆形指示秒的图片,这个图片是PNG的,除了黑色部分其它都是透明的。

然后我们从顶部绘图工具条选中图片,在Form_1上拖动出一个图片,然后选中它,用鼠标右键单击,在弹出菜单中,选择“更换图片文件”,打开上面的图片。

将指示图调整到合适大小后,锁定图片,再继续从顶部选择文字,并在相应的小时处拖动生成时间。

在这个基础上,再从顶部选择矩形和文字,在下部加入一个黑色的矩形和文字用于显示日期,另外,还需要用鼠标右键菜单为Form_1增加一个绑定点,放置在表盘中央,用于定位时针,分针和秒针的绘图起点。

最后,按着CTRL键,可以取消Tag显示,效果如下:

这样表盘的图形制作部分就基本完成了。

二、定时器与绘图逻辑

有了基本的图形后,下面我们从左边的“组件”工具条,选择定时器组件Timer并拖动到Form_1上。

什么是定时器呢?

定时器就是能够设定按固定时间间隔调用回调函数的一个功能对象,它特别适合处理定时触发的逻辑。

在创建出定时器组件后,我们可以选中它,在右边的属性栏可以设置时间间隔为1000(毫秒),这样定时器一旦启动,就会每1000毫秒,也就是每一秒来调用一次回调函数了。

用鼠标在定时器组件上右键单击,在弹出菜单中选择“事件响应”,然后在弹出的“事件响应处理编辑区“对话框中选择”Timer“事件,在右边点击”编辑事件函数”即可进入相应的函数代码中进行编辑。

在代码编辑器中,我们要做的就是通过每秒触发时,获得当前时间,然后在相应的位置来绘制时针,分针和秒针。

不过首先是要在界面初始化函数Form_1_onLoad中启动定时器:

def Form_1_onLoad(uiName): timer = Fun.GetElement(界面名称=uiName,控件名称='Timer_1') Fun.SetShapeText(界面名称=uiName,控件名称='Form_1',图形标记='date',字符串文本='') timer.Start()

这里如果不想写代码,也可以通过鼠标右键菜单,选择界面函数下的Timer的“开始”即可调用定时器的Start函数启动它了!

最后就是在定时器的触发函数中编写具体逻辑了:

def Timer_1_onTimer(uiName,widgetName): root = Fun.GetElement(界面名称=uiName,控件名称="root") drawCanvas = Fun.GetElement(界面名称=uiName,控件名称='Form_1') tm = time.localtime() hour = tm.tm_hour if hour >= 12: hour -= 12 minute = tm.tm_min secoud = tm.tm_sec year_text = str(tm.tm_year) if tm.tm_mon < 10: month_text = str("0%d"%tm.tm_mon) else: month_text = str("%d"%tm.tm_mon) day_text = str(tm.tm_mday) if tm.tm_mday < 10: day_text = str("0%d"%tm.tm_mday) else: day_text = str("%d"%tm.tm_mday) hour_text = str(tm.tm_hour) if tm.tm_hour < 10: hour_text = str("0%d"%tm.tm_hour) else: hour_text = str("%d"%tm.tm_hour) minute_text = str(tm.tm_min) if tm.tm_min < 10: minute_text = str("0%d"%tm.tm_min) else: minute_text = str("%d"%tm.tm_min) secoud_text = str(tm.tm_sec) if tm.tm_sec < 10: secoud_text = str("0%d"%tm.tm_sec) else: secoud_text = str("%d"%tm.tm_sec) text=str("%s月%s日"%(month_text,day_text)) Fun.SetShapeText(界面名称=uiName,控件名称='Form_1',图形标记='date',字符串文本=text) position = Fun.GetShapePoint(界面名称=uiName,控件名称='Form_1',图形标记='circle',绑定点名称='center') centerX = position[0] centerY = position[1] radius = 220 #时针,分针,秒针 drawCanvas.delete('hour') drawCanvas.delete('min') drawCanvas.delete('sec') rad1=2*math.pi*(hour+minute/60)/12 rad2=2*math.pi*(tm.tm_min+tm.tm_sec/60)/60 rad3=2*math.pi*tm.tm_sec/60 x = int(radius * 0.4 * math.sin(rad1)) y = int(-radius * 0.4 * math.cos(rad1)) Fun.DrawLine(界面名称=uiName,控件名称='Form_1',起点X值=centerX,起点Y值=centerY,终点X值=centerX+x,终点Y值=centerY+y,图形中心点位置='nw',终条颜色='#000000',终条宽度=10,虚线长度及间隔=(0,0),图形标记='hour') x = int(radius * 0.5 * math.sin(rad2)) y = int(-radius * 0.5 * math.cos(rad2)) Fun.DrawLine(界面名称=uiName,控件名称='Form_1',起点X值=centerX,起点Y值=centerY,终点X值=centerX+x,终点Y值=centerY+y,图形中心点位置='nw',终条颜色='#000000',终条宽度=6,虚线长度及间隔=(0,0),图形标记='min') x = int(radius * 0.6 * math.sin(rad3)) y = int(-radius * 0.6 * math.cos(rad3)) Fun.DrawLine(界面名称=uiName,控件名称='Form_1',起点X值=int(centerX-0.1*x),起点Y值=int(centerY-0.1*y),终点X值=int(centerX+x),终点Y值=int(centerY+y),图形中心点位置='nw',终条颜色='#ff0000',终条宽度=2,虚线长度及间隔=(0,0),图形标记='min') #中心点 Fun.DrawCircle(界面名称=uiName,控件名称='Form_1',起点X值=centerX-10,起点Y值=centerY-10,终点X值=centerX+10,终点Y值=centerY+10,图形中心点位置='nw',图形填充颜色='#CFCF00',外边框颜色='#CFCF00',外边框宽度=0,外边框虚线长度及间隔=(0,0),图形标记='')

在这段代码中,我们重点是调用绘图函数通过Fun.GetShapePoint获取绑定点位置,然后进行线条绘制和圆形中心的绘制,最终运行效果如下:

在Fun函数库中的绘图函数和玩法还有许多,你可以通过在代码中输入“Fun.”来唤起Fun函数智能提示,并以Draw作为前缀来查看函数列表:

你学会了么?下一节,我们将基于绘图,做一些更炫酷的动态界面,保持对PyMe的关注哦!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/6 8:13:46

信安毕业设计2026选题推荐

0 选题推荐 - 网络与信息安全篇 毕业设计是大家学习生涯的最重要的里程碑&#xff0c;它不仅是对四年所学知识的综合运用&#xff0c;更是展示个人技术能力和创新思维的重要过程。选择一个合适的毕业设计题目至关重要&#xff0c;它应该既能体现你的专业能力&#xff0c;又能满…

作者头像 李华
网站建设 2026/2/8 12:10:40

Winhance终极指南:如何快速优化和定制Windows系统

Winhance终极指南&#xff1a;如何快速优化和定制Windows系统 【免费下载链接】Winhance PowerShell GUI application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance 想要让Windows系统运行更快、…

作者头像 李华
网站建设 2026/2/6 10:56:26

3步掌握Blender摄影测量导入:从数据到3D场景的完整工作流

3步掌握Blender摄影测量导入&#xff1a;从数据到3D场景的完整工作流 【免费下载链接】Blender-Addon-Photogrammetry-Importer Addon to import different photogrammetry formats into Blender 项目地址: https://gitcode.com/gh_mirrors/bl/Blender-Addon-Photogrammetry-…

作者头像 李华
网站建设 2026/2/5 6:15:19

数字沙盘:装配动画如何驱动产品研发革命

在产品研发的漫长旅程中&#xff0c;从概念构思到现实产品的转化往往充满未知挑战。如今&#xff0c;装配动画技术正成为这场变革中的核心推手&#xff0c;它如同一个精密运转的数字沙盘&#xff0c;让设计团队在虚拟世界中预见、优化和验证真实世界的制造全过程&#xff0c;从…

作者头像 李华
网站建设 2026/2/7 22:20:34

Nautobot网络自动化平台:终极安装与配置完全指南

Nautobot网络自动化平台&#xff1a;终极安装与配置完全指南 【免费下载链接】nautobot Network Source of Truth & Network Automation Platform 项目地址: https://gitcode.com/gh_mirrors/na/nautobot Nautobot作为一款开源的网络自动化平台&#xff0c;正在重新…

作者头像 李华