返回顶部
首页 > 资讯 > 后端开发 > Python >基于PyQt5制作一个动态指针时钟
  • 706
分享到

基于PyQt5制作一个动态指针时钟

2024-04-02 19:04:59 706人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

想实现这样一个功能,然后pyQt5中又没有现成的组件可以使用,于是就想着只能通过绘图的方式来实现。说到绘图的话,turtle框架无疑是最常见的选择,但其实通过pyqt5的QPain

想实现这样一个功能,然后pyQt5中又没有现成的组件可以使用,于是就想着只能通过绘图的方式来实现。说到绘图的话,turtle框架无疑是最常见的选择,但其实通过pyqt5的QPainter组件也是可以实现的。而且最后呈现出来的效果还是挺漂亮的。

实现思路:通过使用pyqt5的QPainter组件来绘制好时钟的图表,最后通过定时器不断的改变当前当前时间在图表上面的显示位置。这样最终就实现了一个指针时钟在不断的走动的过程。

和前面的UI应用一样,我们用到的UI相关的组件库还是这三个。

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

这次新使用了一个数学计算库,因为牵扯到数据计算相关的部分。

from math import *

应用操作相关的模块

import sys

动态时钟的主要实现过程我放在下面了,有需要的朋友可以自己研究一下。

class PointerClock(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("动态指针时钟  公众号:[python 集中营]")
        self.setWindowIcon(QIcon('clock.ico'))
        self.timer = QTimer()
        # 设置窗口计时器
        self.timer.timeout.connect(self.update)
        self.timer.start(1000)

    def paintEvent(self, event):
        '''
        实时刷新指针图像
        :param event:
        :return:
        '''
        '''分别定义小时、分钟、秒钟的坐标点'''
        '''
        QPoint(int x, int y);创建坐标点,x、y分别代表横坐标、纵坐标
        '''
        hour_point = [QPoint(7, 8), QPoint(-7, 8), QPoint(0, -30)]
        min_point = [QPoint(7, 8), QPoint(-7, 8), QPoint(0, -65)]
        secn_point = [QPoint(7, 8), QPoint(-7, 8), QPoint(0, -80)]

        '''定义三种颜色、用于后面设置三种指针的颜色'''
        hour_color = QColor(182, 98, 0, 182)
        min_color = QColor(0, 130, 130, 155)
        sec_color = QColor(0, 155, 227, 155)

        '''获取QWidget对象的宽度和长度的最小值'''
        min_size = min(self.width(), self.height())

        painter = QPainter(self)  # 创建坐标系图像绘制对象
        painter.setRenderHint(QPainter.Antialiasing)

        # 将QWidget对象的中心位置作为绘制的中心坐标点
        painter.translate(self.width() / 2, self.height() / 2)

        # 对尺寸进行缩放
        painter.scale(int(min_size / 200), int(min_size / 200))

        # 保存状态
        painter.save()

        '''绘制时钟表盘的时间刻度线'''

        for a in range(0, 60):
            if (a % 5) != 0:
                # 每1/60绘制一个刻度线作为分钟刻度线
                painter.setPen(min_color)
                painter.drawLine(92, 0, 96, 0)
            else:
                # 每5/60绘制一个刻度线作为小时刻度线
                painter.setPen(hour_color)
                painter.drawLine(88, 0, 96, 0)  # 绘制小时刻度线
            # 每分钟旋转6度
            painter.rotate(360 / 60)
        # 恢复状态
        painter.restore()

        '''绘制时钟表盘上面的数字'''
        # 保存状态
        painter.save()
        # 获取字体对象
        font = painter.font()
        # 设置粗体
        font.setBold(True)
        painter.setFont(font)
        # 获取字体大小
        font_size = font.pointSize()
        # 设置之前定义好的颜色
        painter.setPen(hour_color)
        hour_num = 0
        radius = 100
        for i in range(0, 12):
            # 按照12小时制,每三个小时绘制一个小时数字,需要遍历4次
            hour_num = i + 3  # 按QT-Qpainter的坐标系换算,3小时的刻度线对应坐标轴0度
            if hour_num > 12:
                hour_num = hour_num - 12
            # 根据字体的大小计算出写入小时数字的x、y的位置
            x = radius * 0.8 * cos(i * 30 * pi / 180.0) - font_size
            y = radius * 0.8 * sin(i * 30 * pi / 180.0) - font_size / 2.0
            width = font_size * 2
            height = font_size
            painter.drawText(QRectF(x, y, width, height), Qt.AlignCenter, str(hour_num))
        # 恢复状态
        painter.restore()

        '''绘制时钟表盘的时、分、秒的指针'''

        # 获取当前时间
        time = QTime.currentTime()

        # 绘制小时指针
        painter.save()
        # 取消轮廓线
        painter.setPen(Qt.NoPen)
        # 设置小时指针的颜色
        painter.setBrush(hour_color)
        # 小时指针逆时针旋转
        painter.rotate(30 * (time.hour() + time.minute() / 60))
        # 绘制时钟指针
        painter.drawConvexPolyGon(QPolygonF(hour_point))
        # 恢复状态
        painter.restore()

        # 绘制分钟指针
        painter.save()
        # 取消轮廓线
        painter.setPen(Qt.NoPen)
        # 设置分钟指针的颜色
        painter.setBrush(min_color)
        # 分钟指针逆时针旋转
        painter.rotate(6 * (time.minute() + time.second() / 60))
        # 绘制分钟指针
        painter.drawConvexPolygon(QPolygonF(min_point))
        # 恢复状态
        painter.restore()

        # 绘制秒钟指针
        painter.save()
        # 取消轮廓线
        painter.setPen(Qt.NoPen)
        # 设置秒针颜色
        painter.setBrush(sec_color)
        # 秒钟指针逆时针旋转
        painter.rotate(6 * time.second())
        # 绘制秒钟指针
        painter.drawConvexPolygon(QPolygonF(secn_point))
        # 恢复状态
        painter.restore()

最后,还是通过main()函数直接启动整个App。

if __name__ == "__main__":
    app = QApplication(sys.argv)
    fORM = PointerClock()
    form.show()
    app.exec_()

完整代码

# -*- coding:utf-8 -*-
# @author Python 集中营
# @date 2022/1/25
# @file test9.py

# done


# 利用pyqt5制作指针钟表显示实施时间

# 想实现这样一个功能,然后pyqt5中又没有现成的组件可以使用,于是就想着只能通过绘图的方式来实现。
# 说到绘图的话,turtle框架无疑是最常见的选择,但其实通过pyqt5的QPainter组件也是可以实现的。而且最后呈现出来的
# 效果还是挺漂亮的。

# 实现思路:通过使用pyqt5的QPainter组件来绘制好时钟的图表,最后通过定时器不断的改变当前当前时间在图表上面的显示位置。
# 这样最终就实现了一个指针时钟在不断的走动的过程。

# 和前面的UI应用一样,我们用到的UI相关的组件库还是这三个。
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

# 这次新使用了一个数学计算库,因为牵扯到数据计算相关的部分。
from math import *

# 应用操作相关的模块
import sys


class PointerClock(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("动态指针时钟  公众号:[Python 集中营]")
        self.setWindowIcon(QIcon('clock.ico'))
        self.timer = QTimer()
        # 设置窗口计时器
        self.timer.timeout.connect(self.update)
        self.timer.start(1000)

    def paintEvent(self, event):
        '''
        实时刷新指针图像
        :param event:
        :return:
        '''
        '''分别定义小时、分钟、秒钟的坐标点'''
        '''
        QPoint(int x, int y);创建坐标点,x、y分别代表横坐标、纵坐标
        '''
        hour_point = [QPoint(7, 8), QPoint(-7, 8), QPoint(0, -30)]
        min_point = [QPoint(7, 8), QPoint(-7, 8), QPoint(0, -65)]
        secn_point = [QPoint(7, 8), QPoint(-7, 8), QPoint(0, -80)]

        '''定义三种颜色、用于后面设置三种指针的颜色'''
        hour_color = QColor(182, 98, 0, 182)
        min_color = QColor(0, 130, 130, 155)
        sec_color = QColor(0, 155, 227, 155)

        '''获取QWidget对象的宽度和长度的最小值'''
        min_size = min(self.width(), self.height())

        painter = QPainter(self)  # 创建坐标系图像绘制对象
        painter.setRenderHint(QPainter.Antialiasing)

        # 将QWidget对象的中心位置作为绘制的中心坐标点
        painter.translate(self.width() / 2, self.height() / 2)

        # 对尺寸进行缩放
        painter.scale(int(min_size / 200), int(min_size / 200))

        # 保存状态
        painter.save()

        '''绘制时钟表盘的时间刻度线'''

        for a in range(0, 60):
            if (a % 5) != 0:
                # 每1/60绘制一个刻度线作为分钟刻度线
                painter.setPen(min_color)
                painter.drawLine(92, 0, 96, 0)
            else:
                # 每5/60绘制一个刻度线作为小时刻度线
                painter.setPen(hour_color)
                painter.drawLine(88, 0, 96, 0)  # 绘制小时刻度线
            # 每分钟旋转6度
            painter.rotate(360 / 60)
        # 恢复状态
        painter.restore()

        '''绘制时钟表盘上面的数字'''
        # 保存状态
        painter.save()
        # 获取字体对象
        font = painter.font()
        # 设置粗体
        font.setBold(True)
        painter.setFont(font)
        # 获取字体大小
        font_size = font.pointSize()
        # 设置之前定义好的颜色
        painter.setPen(hour_color)
        hour_num = 0
        radius = 100
        for i in range(0, 12):
            # 按照12小时制,每三个小时绘制一个小时数字,需要遍历4次
            hour_num = i + 3  # 按QT-Qpainter的坐标系换算,3小时的刻度线对应坐标轴0度
            if hour_num > 12:
                hour_num = hour_num - 12
            # 根据字体的大小计算出写入小时数字的x、y的位置
            x = radius * 0.8 * cos(i * 30 * pi / 180.0) - font_size
            y = radius * 0.8 * sin(i * 30 * pi / 180.0) - font_size / 2.0
            width = font_size * 2
            height = font_size
            painter.drawText(QRectF(x, y, width, height), Qt.AlignCenter, str(hour_num))
        # 恢复状态
        painter.restore()

        '''绘制时钟表盘的时、分、秒的指针'''

        # 获取当前时间
        time = QTime.currentTime()

        # 绘制小时指针
        painter.save()
        # 取消轮廓线
        painter.setPen(Qt.NoPen)
        # 设置小时指针的颜色
        painter.setBrush(hour_color)
        # 小时指针逆时针旋转
        painter.rotate(30 * (time.hour() + time.minute() / 60))
        # 绘制时钟指针
        painter.drawConvexPolygon(QPolygonF(hour_point))
        # 恢复状态
        painter.restore()

        # 绘制分钟指针
        painter.save()
        # 取消轮廓线
        painter.setPen(Qt.NoPen)
        # 设置分钟指针的颜色
        painter.setBrush(min_color)
        # 分钟指针逆时针旋转
        painter.rotate(6 * (time.minute() + time.second() / 60))
        # 绘制分钟指针
        painter.drawConvexPolygon(QPolygonF(min_point))
        # 恢复状态
        painter.restore()

        # 绘制秒钟指针
        painter.save()
        # 取消轮廓线
        painter.setPen(Qt.NoPen)
        # 设置秒针颜色
        painter.setBrush(sec_color)
        # 秒钟指针逆时针旋转
        painter.rotate(6 * time.second())
        # 绘制秒钟指针
        painter.drawConvexPolygon(QPolygonF(secn_point))
        # 恢复状态
        painter.restore()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = PointerClock()
    form.show()
    app.exec_()

以上就是基于PyQt5制作一个动态指针时钟的详细内容,更多关于PyQt5动态时钟的资料请关注编程网其它相关文章!

--结束END--

本文标题: 基于PyQt5制作一个动态指针时钟

本文链接: https://lsjlt.com/news/140289.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 基于PyQt5制作一个动态指针时钟
    想实现这样一个功能,然后pyqt5中又没有现成的组件可以使用,于是就想着只能通过绘图的方式来实现。说到绘图的话,turtle框架无疑是最常见的选择,但其实通过pyqt5的QPain...
    99+
    2024-04-02
  • 基于PyQt5如何制作一个动态指针时钟
    这篇文章主要介绍基于PyQt5如何制作一个动态指针时钟,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!想实现这样一个功能,然后pyqt5中又没有现成的组件可以使用,于是就想着只能通过绘图的方式来实现。说到绘图的话,tu...
    99+
    2023-06-29
  • Python中利用pyqt5制作指针钟表显示实时时间(指针时钟)
    文末附完整源代码实现过程... 想实现这样一个功能,然后pyqt5中又没有现成的组件可以使用,于是就想着只能通过绘图的方式来实现。说到绘图的话,turtle框架无疑是最常见的选择,...
    99+
    2024-04-02
  • 基于PyQt5制作一个gif动态图片生成器
    这个小工具制作的目的是为了将多张图片组合后生成一张动态的GIF图片。设置界面化的操作,只需要将选中的图片导入最后直接生成动态图片。 导入界面相关的第三方库 from PyQt5.Q...
    99+
    2024-04-02
  • 基于PyQt5如何制作一个gif动态图片生成器
    这篇文章的内容主要围绕基于PyQt5如何制作一个gif动态图片生成器进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!这个小工具制作的目的是为了将多张图...
    99+
    2023-06-28
  • Python中怎么用pyqt5制作指针钟表显示时间
    这篇文章主要介绍“Python中怎么用pyqt5制作指针钟表显示时间”,在日常操作中,相信很多人在Python中怎么用pyqt5制作指针钟表显示时间问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中...
    99+
    2023-06-29
  • 基于CSS3+jQuery动态时钟制作的示例分析
    这篇文章主要介绍基于CSS3+jQuery动态时钟制作的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Hi,大家好,我叫Toby Pitman,Chris曾邀请我写一篇关于最近我在论坛上发的一些实验成果,于是...
    99+
    2023-06-12
  • 基于PyQt5制作一个截图翻译工具
    目录功能介绍UI 界面截图翻译文字识别全局热键(快捷键)托盘管理主代码功能介绍 1.翻译功能 2.截图功能(快捷键 + 截图存储到剪切板中) 3.文字识别OCR(基于百度API的文字...
    99+
    2024-04-02
  • 基于PyQT5制作一个课堂点名系统
    刷抖音的时候发现一个老师在用的课堂点名系统。用PyQt5实现了一下同款,导入学生姓名,测试了一下完美运行。 操作效果展示: 完整源代码块还是放在了文章的最后面 使用的时候准备好学生...
    99+
    2024-04-02
  • 基于PyQt5制作一个windows通知管理器
    前几天看到一个python框架win10toast,它可以用来做windows的消息通知功能。通过设定通知的间隔时间来实现一些事件通知的功能,比如可以可以提醒一头扎进代码编写过程的我...
    99+
    2024-04-02
  • 基于PyQT5制作一个桌面摸鱼工具
    目录前言按键功能控制主要功能核心代码前言 现在我能一整天都严肃地盯着屏幕,看起来就像在很认真地工作, 利用摸鱼,打开小说,可实行完美摸鱼,实时保存进度 用PYQT5 Mock一个摸鱼...
    99+
    2024-04-02
  • 基于PyQt5制作一个猜数字小游戏
    开始之前,直接来看一下实现后的效果。想自己实现或者需要源码的童鞋直接进场... 将PyQt5的相关模块直接导入即可。 from PyQt5.QtGui import * from ...
    99+
    2024-04-02
  • 基于PyQt5制作一个PDF文件合并器
    操作说明:选择多个PDF文件,执行完合并后会生成一个新的PDF文件,这个新的PDF文件包含所有源PDF文件的页面。 将相关的三方模块导入到代码块中... from PyQt5.Qt...
    99+
    2024-04-02
  • 基于PyQt5制作一个表情包下载器
    每次和朋友聊天苦于没有表情包,而别人的表情包似乎是取之不尽、用之不竭。作为一个程序员哪能甘愿认输,于是做了一个表情包下载器供大家斗图。 首先,还是介绍一下设计思路吧,和我们之前做的百...
    99+
    2024-04-02
  • 基于PyQt5制作一个群发邮件工具
    演示示例使用QQ邮箱发送邮件,先获取自己的QQ邮箱的授权码。因为后面发送邮件时需要使用自己的授权码作为邮箱的密码登录邮箱最后达到发送邮件的目的。 将UI处理的相关的界面包导入进来...
    99+
    2024-04-02
  • 基于PyQT5制作一个二维码生成器
    个性化二维码的exe桌面应用的获取方式我放在文章最后面了,注意查收。通过执行打包后的exe应用程序可以直接运行生成个性化二维码。 开始之前先来看一下通过二维码生成器是如何生成个性化二...
    99+
    2024-04-02
  • 基于PyQT5制作一个敏感词检测工具
    设计思路:根据敏感词库文件筛选,查看输入的文本中是否包含敏感词汇。从而过滤出相关的敏感词。 导入应用相关的模块。 import os import logging import s...
    99+
    2024-04-02
  • 基于PyQt5制作一个数据图表生成器
    我的需求:手动配置X轴、Y轴、图表标题等参数自动通过Pyecharts模块生成可视化的html数据图表,并将浏览器图表展示到UI界面上。 制作出图表后的效果展示如下: 另外,生成...
    99+
    2024-04-02
  • Python编程使用PyQt5制作动态钟表示例
    目录前言环境配置实现思路老式钟表制作电子表制作合并两表界面核心代码总结前言 大家好,我是小张~ 记得小时候,家里只有一个钟表用来看时间(含有时针、分针、秒针的那种),挂在墙上哒哒哒响...
    99+
    2024-04-02
  • 基于PyQt5怎么制作一个windows通知管理器
    本篇内容介绍了“基于PyQt5怎么制作一个windows通知管理器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!python框架win10t...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作