使用PyQT实现模拟表盘时钟的显示效果

news2024/11/28 11:59:19

代码

class clockThread(QThread):

    update_ui_signal = pyqtSignal(str)

    def __init__(self, window):
        super(clockThread, self).__init__()
        # 信号绑定槽函数
        self.update_ui_signal.connect(self.draw_time)
        self.hour = 0
        self.minute = 0
        self.second = 0

        self.window = window

        self.window.lcdNumber.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu)
        self.window.lcdNumber.setFrameShape(QtWidgets.QFrame.NoFrame)
        # InsideWindow.lcdNumber.setDigitCount(9)
        # 创建阴影效果对象并设置偏移和颜色
        shadow = QGraphicsDropShadowEffect()
        shadow.setBlurRadius(5)
        shadow.setColor(QtGui.QColor(0, 0, 0, 255))
        shadow.setOffset(4, -3)
        # 将阴影效果应用于QLCDNumber的字体
        self.window.lcdNumber.setGraphicsEffect(shadow)

        image = QImage('pic/表盘原图抠图.png')
        self.pixmap = QPixmap.fromImage(image)

        rect = self.window.label_clock.geometry()
        self.center_x = int(rect.x() + rect.width() / 2)
        self.center_y = int(rect.y() + rect.height() / 2)

        self.hour_points = [QPoint(10, 0), QPoint(-10, 0), QPoint(0, -150)]
        self.minute_points = [QPoint(10, 0), QPoint(-10, 0), QPoint(0, -250)]
        self.second_points = [QPoint(10, 0), QPoint(-10, 0), QPoint(0, -300)]




    def draw_time(self, time_str):
        self.hour = int(time_str[-8:-6])
        self.minute = int(time_str[-5:-3])
        self.second = int(time_str[-2:])

        # print("-------------", self.hour, self.minute, self.second, time_str[:8])

        self.window.lcdNumber.display(time_str[-8:])
        self.window.lcdNumber_date.display(time_str[:8])

        self.window.label_clock.setPixmap(self.pixmap)

        self.painter = QtGui.QPainter(self.window.label_clock.pixmap())
        self.painter.setRenderHint(QPainter.Antialiasing)
        # print(self.center_x, self.center_y)
        self.painter.translate(self.center_x-20, self.center_y+180)  # 平移到label中心
        # self.painter.scale(1, 1)  # 进行尺度缩放

        # 绘制时针
        self.painter.setBrush(QColor(0, 0, 127))
        self.painter.save()
        self.painter.rotate(30.0*((self.hour + self.minute/60.0)))
        self.painter.drawConvexPolygon(QPolygon(self.hour_points))
        self.painter.restore()

        # 绘制分针
        self.painter.setBrush(QColor(0, 127, 127))
        self.painter.save()
        self.painter.rotate(6.0*(self.minute + self.second/60.0))
        self.painter.drawConvexPolygon(QPolygon(self.minute_points))
        self.painter.restore()

        # 绘制秒针
        self.painter.setBrush(QColor(150, 43, 5))
        self.painter.save()
        self.painter.rotate(6.0 * self.second)
        self.painter.drawConvexPolygon(QPolygon(self.second_points))
        self.painter.restore()

        self.painter.end()


    def run(self):
        while True:  # 让子线程一直运行,等待主线程(ui线程)下发的任务
            time.sleep(1)
            # print("clock thread")

效果

该代码定义了一个 clockThread 类,继承自 PyQt5 的 QThread 类。其主要功能是实现一个模拟时钟的线程,在这个线程中,通过 draw_time 方法更新时针、分针、秒针的位置,并在表盘上绘制出来,并将更新后的时间显示到 lcdNumber 控件中。

一些控件的定义和初始化直接使用QtDesigner生成实现的,暂未在程序中体现。

具体实现过程如下:

  1. __init__ 方法中进行一些初始化操作,包括:

    • 绑定信号 update_ui_signal 与槽函数 draw_time
    • 定义时、分、秒的变量并初始化为 0;
    • 获取窗口对象及其控件,设置阴影效果、载入表盘图片、计算表盘中心坐标、定义时针、分针、秒针的坐标点信息等。
  2. draw_time 方法被信号槽机制调用,以时间字符串作为参数。该方法首先根据时间字符串解析出时、分、秒的值,然后将时间字符串的前 8 位显示到 lcdNumber_date 控件中,将时间字符串的后 8 位显示到 lcdNumber 控件中。接着,重新载入表盘图片,并创建 QPainter 对象,在表盘上绘制时针、分针、秒针,并在最后结束 QPainter。

  3. run 方法是 QThread 类中的虚函数,自动调用该方法以启动线程。在 run 方法中,使用一个无限循环,不断地轮询睡眠 1 秒钟,并等待主线程(ui线程)下发任务。每当有时间信号发送时,就会执行 draw_time 方法更新时针、分针、秒针的位置,并在表盘上绘制出来。

  4. 一些注意事项是,目前没有进行页面的自适应,需要自行修改代码实现;相对位置也是使用的绝对坐标,需要修改

素材

分别是效果图原图和抠图后的素材,直接在QtDesigner的lcdNumber的背景图路径中修改为抠图的素材路径即可

注:本文除代码外大部分内容由GPT-3.5生成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构与算法·第6章【树】

基本操作 树的相关定义 树的深度(高度):树中叶子结点所在的最大层次 森林: m m m棵互不相交的树的集合 二叉树 二叉树或为空树,或是由一个根结点加上两棵分别称为左子树和右子树的、互不交的二叉树组成。 性质 二…

JavaCV音视频开发宝典:使用JavaCV读取海康平台或海康网络摄像头sdk回调视频TS码流并解析预览图像

《JavaCV音视频开发宝典》专栏目录导航 《JavaCV音视频开发宝典》专栏介绍和目录 ​ 前言 两年前博主写了如何利用JavaCV解析各种h264裸流,《JavaCV音视频开发宝典:使用javacv读取GB28181、海康大华平台和网络摄像头sdk回调视频码流并解析预览图像》,但是随着时间变化,各…

企业邮箱如何设置邮件审核

有的时候对外给客户或合作伙伴等发送邮件需要领导审核后再发,以前都是先发给领导,领导审核以后再重新发给客户, 这样的流程太过繁琐。 新的邮件审核功能既能满足审核需求,又避免了重复发信,可以极大提高工作效率。 设…

使用VitePress静态网站生成器创建组件库文档网站并部署到GitHub

Vue3TSVite开发组件库并发布到npm 网站在线预览: Vue Amazing UI | Amazing UI Components LibraryAmazing UI 组件库https://themusecatcher.github.io/vue-amazing-ui/参考文档: VitePress 目录 一、安装依赖及配置 1、安装 vitepress 2、在 p…

想要精通算法和SQL的成长之路 - 反转链表

想要精通算法和SQL的成长之路 - 反转链表 前言一. 反转链表 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 反转链表 原题链接 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 思路如下: 我们可以通过一次遍历&#xff…

该怎么用设计测试用例测网上银行转账?

目录 前言 1、网上银行转账是怎么测的,设计一下测试用例。 回答思路: 2、测试工作的流程?缺陷状态有什么?设计测试用例有几种方法? 修改完以后,有两种处理情况: 3、在项目中找到的经典BUG是什么? 4、定期…

kali系统渗透

用kali远程ssh时,如果不能的话 按照以下方法 ┌──(root㉿kali)-[~]└─# mkdir ~/.ssh┌──(root㉿kali)-[~]└─# vim ~/.ssh/configHost *HostkeyAlgorithms ssh-rsaPubkeyAcceptedKeyTypes ssh-rsa msfconlole -q //进入马上发不显示内容,所以加…

编程实现人脸识别

1.更改url 用翔云平台下的人脸识别的API文档 把他贴到url中: 2.定义参数 (根据平台给定的这些串口接收参数来定义) key和secret在这里找: 3.指定post内容 把这部分定义成一个postString 4.字符串的拼接 sprintf函数调用的主…

使用粒子群优化算法(PSO)辨识锂电池二阶RC模型参数(附MATLAB代码)

目录 一、原理部分 二、代码详解部分 三、结果及分析 一、原理部分 PSO算法由美国学者于 1995 年提出,因其算法简单、效果良好,而在很多领域得到了广泛应用。该算法的起源是模拟鸟群的觅食过程,形成一种群体智能搜索算法。 其核心是&#…

使用Flask高效构建Web应用

1、聊聊Flask框架 Flask官方文档 Flask是Armin ronacher基于Python开发的微型Web框架,诞生于2010年,它依赖于jinja2模板和Werkzeug WSGI服务。Flask的核心简单易于扩展,它不会替你做出太多决策比如使用何种数据库或模板引擎,这些都…

抖音seo矩阵系统源码解析

抖音SEO矩阵系统源码是一种用于优化抖音视频内容的工具,可以帮助用户提高抖音视频的搜索排名和流量,从而增加视频曝光和转化率。该系统包括两部分,即数据收集和分析模块以及SEO策略和实施模块。 数据收集和分析模块主要负责从抖音平台上收集…

认识功能安全

01、什么是功能安全 1-背景简介 由于汽车的复杂性,整个行业正在致力于提供符合安全要求的零部件系统。比如,线控油门系统,当驾驶员踩下油门踏板,踏板上的传感器向控制器发送信号时,控制器会综合分析如发动机转速、车…

ERP系统实施,8个需要了解的关键绩效指标

实施ERP系统是一项复杂的、耗时的工作,但它也代表了企业重新思考其战略、目标和流程的绝佳机会。成功的ERP实施可以激发创新,改善企业的所有领域。例如,通过集中企业各部门不断增长的财务和业务数据,所有的决策者都在同一个页面上…

非煤矿山电子封条系统算法方案 opencv

非煤矿山电子封条系统算法部署方案是基于pythonopencv网络模型Ai视频图像识别技术,非煤矿山电子封条系统算法部署方案对出入井人员、人员变化及非煤矿山生产作业状态等状况,及时发现处理异常动态将自动发出警报。OpenCV的全称是Open Source Computer Vis…

亲身经历告诉你,0基础转行学Python,毕业就能15000

对生活现状的不满,对自己浑浑噩噩的厌恶,以及对互联网行业的憧憬,让我下定决心选择去黑马程序员开启转行之旅。 学科 | Python大数据开发 薪资 | 15000 时间总是在你回忆往事时才会觉得短暂,来黑马之前觉得六个月将是一段很漫长…

操作系统原理 —— 内存动态分区分配算法(二十一)

在上一个章节我们讲了内存连续分配的几种方式,有单一、固定、动态这三种,在固定、动态这种里面,操作系统会记录空闲分区表,这个表是用来记录当前空闲的内存。 那么在之后有新的进程装入内存,需要从空闲分区表中找到一…

从零手写操作系统之RVOS内存管理模块简单实现-02

从零手写操作系统之RVOS内存管理模块简单实现-02 内存管理分类内存映射表(Memory Map)Linker Script 链接脚本语法基于符号定义获取程序运行时内存分布 基于 Page 实现动态内存分配代码讲解调试 扩展 本系列参考: 学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春 整…

qrcode.min.js下载

目录 qrcode.min.js下载步骤: 去官网 下载后解压: 如下:就可以得到 qrcode.min.js文件了 qrcode.min.js下载步骤: 去官网 可以前往qrcode官网(https://davidshimjs.github.io/qrcodejs/)下载qrcode.m…

培训pytorch(未完善) bp算法原理

生物的神经元 接受外部的刺激 神经网络工作流程演示

MySQL高可用集群解决方案之:MySql Cluster搭建

MySQL是当前使用最广泛的关系型数据库管理系统之一,但MySQL在高并发访问和大量数据处理方面存在较为明显的性能瓶颈。为了解决MySQL单点故障带来的不便和可扩展性问题,我们需要构建稳定性极高的MySQL集群方案。本文将介绍一种快速搭建MySQL集群的解决方案…