当前位置: 首页 > news >正文

零基础: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的关注哦!

http://www.rkmt.cn/news/180376.html

相关文章:

  • LFM2-8B-A1B:混合专家架构如何重塑边缘AI计算范式
  • APX585音频分析仪APX585B 技术指导
  • free5GC终极指南:开源5G核心网快速部署完全教程
  • AgentScope多智能体评估框架实战指南:构建高效评测系统
  • MeterSphere完整指南:5步快速掌握开源测试平台核心功能
  • 债务斩杀线
  • 深入解析CPU核心间延迟测量工具:core-to-core-latency
  • 5分钟掌握Whisper语音转文字:零门槛终极使用手册
  • Nunchaku FLUX.1-Krea-dev量化模型:让AI绘画触手可及
  • 还在为强化学习环境集成烦恼?PyTorch算法库完整对接方案揭秘
  • Miniforge离线部署终极指南:5分钟构建完整Python数据科学环境
  • 2025年细白银铝银浆生产厂家排行榜,推荐漂浮型铝银浆生产厂家新测评 - 工业品网
  • Miniconda-Python3.9镜像适用于科研论文复现
  • PHPMyAdmin终极安装手册:从零开始搭建数据库管理平台
  • Monaco Editor智能提示性能调优全攻略
  • Dense_Haze浓雾去雾数据集:计算机视觉研究的专业基准
  • 2025年求推荐托福培训机构、信誉好的托福培训专业公司年度排名 - 工业设备
  • 基于SpringBoot的闲置物品交易系统的设计与实现
  • 用HTML Canvas动态绘制PyTorch训练曲线
  • 斐讯N1双系统实战手册:OpenWrt与Android TV深度集成方案
  • AI+3D视觉机器⼈智能平台核心步骤
  • Anaconda Navigator卡顿?改用Miniconda命令行更流畅
  • 2025年超细硫酸钡供应商与天然硫酸钡厂家年度排名,沉淀硫酸钡推荐指南 - mypinpai
  • 终极指南:用图形化界面轻松管理GitHub代码仓库
  • ESP32摄像头开发实战指南:从零搭建高清视觉系统
  • 2025年评价高的纬编网眼布厂家口碑热榜(用户推荐) - 品牌宣传支持者
  • 计算机毕业设计springboot网络相册设计与实现 基于Spring Boot框架的在线相册管理系统开发与应用 Spring Boot驱动的网络影集设计与实践
  • ETASOLUTIONS钰泰 ETA3485S2F SOT23-5 DC-DC电源芯片
  • Miniconda中更换conda默认源为清华镜像
  • 企业级AI工程实践:从概念验证到生产部署的完整指南