Python中利用pyqt5制作指针钟表显示实时时间(指针时钟)
作者:Python?集中营 发布时间:2023-04-30 22:11:13
标签: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("动态指针时钟")
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()
'''绘制时钟表盘上面的数字'''
# 获取字体对象
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))
'''绘制时钟表盘的时、分、秒的指针'''
# 获取当前时间
time = QTime.currentTime()
# 绘制小时指针
# 取消轮廓线
painter.setPen(Qt.NoPen)
# 设置小时指针的颜色
painter.setBrush(hour_color)
# 小时指针逆时针旋转
painter.rotate(30 * (time.hour() + time.minute() / 60))
# 绘制时钟指针
painter.drawConvexPolygon(QPolygonF(hour_point))
# 绘制分钟指针
# 设置分钟指针的颜色
painter.setBrush(min_color)
# 分钟指针逆时针旋转
painter.rotate(6 * (time.minute() + time.second() / 60))
painter.drawConvexPolygon(QPolygonF(min_point))
# 绘制秒钟指针
# 设置秒针颜色
painter.setBrush(sec_color)
# 秒钟指针逆时针旋转
painter.rotate(6 * time.second())
painter.drawConvexPolygon(QPolygonF(secn_point))
最后,还是通过main()函数直接启动整个App。
if __name__ == "__main__":
app = QApplication(sys.argv)
form = PointerClock()
form.show()
app.exec_()
动态时钟完整源代码如下所示:
http://xiazai.jb51.net/202202/yuanma/pythonshizh_jb51.rar
来源:https://www.cnblogs.com/lwsbc/archive/2022/02/23/15929520.html
0
投稿
猜你喜欢
- 升级pippip版本必须升级到20.0.4版本才能应用;方法一、在pycharm中对pip进行升级;方法二、通过命令进行升级python3.
- MySQL的本地备份和双机相互备份脚本:首先,我们需要修改脚本进行必要的配置,然后以root用户执行。◆1. 第一执行远程备份时先用 fir
- 本文实例为大家分享了opencv实现车牌识别的具体代码,供大家参考,具体内容如下(1)提取车牌位置,将车牌从图中分割出来;(2)车牌字符的分
- 本文实例讲述了Python实现微信中找回好友、群聊用户撤回的消息功能。分享给大家供大家参考,具体如下:还在好奇好友撤回了什么消息吗?群里撤回
- python操作mongodb数据库# !/usr/bin/env python# -*- coding:utf-8 -*-"&q
- 如题,首先读取视频路径,其次根据视频名称创建对应的文件夹,再逐帧将视频帧读入。import cv2import argparseimport
- 介绍分面是指事物的多维度属性。例如一本书包含主题、作者、年代等分面。而分面搜索是指通过事物的这些属性不断筛选、过滤搜索结果的方法。可以将分面
- 介绍当在图像上训练深度神经网络模型时,通过对由数据增强生成的更多图像进行训练,可以使模型更好地泛化。常用的增强包括水平和垂直翻转/移位、以一
- 如下所示:a, b, c = 1, 2, 3 # 1.常规 if a>b: &nbs
- 机器学习之随机森林,供大家参考,具体内容如下1、Bootstraping(自助法)  
- 1、PHP 中如何正确统计中文字数?这个是困扰我很久的问题,PHP 中有很多函数可以计算字符串的长度,比如下面的例子,分别使用了
- 缘起最近复习设计模式拜读谭勇德的<<设计模式就该这样学>>该书以java语言演绎了常见设计模式本系列笔记拟采用gol
- 前言 一直用ASP+ACCESS来编写网页和公司的内部应用系统,内部应用系统也就是大家说的OA吧,这个我也不知道,公司又叫它ERP,反正不管
- 前言有一天朋友A向我抱怨,他的老板要求他把几百份word填好的word表格简历信息整理到excel中,看着他一个个将姓名,年龄……从word
- 不知道有多少人清楚的知道,在Oracle中,如果一个复合索引,假定索引(a,b,c)三个字段,删除了(包括unused)其中一个字段,Ora
- 本文实例讲述了PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法。分享给大家供大家参考,具体如下:前面一篇 PHP递归实现文件夹的复制
- 在VBScript中有Filter这个函数可以用来对数组进行过滤,并返回原数组的一个子集数组。语法说明: 引用内容Filter 函
- 1:下载FCKEditor编辑器下载下来后解压到你网站的目录,最好就放在根目录下,文件夹名字就用FCKEditor;这里可以随便自己喜好,但
- 对于如何结束一个Python程序或者用Python操作去结束一个进程等,Python本身给出了好几种方法,而这些方式也存在着一些区别,对相关
- 这份代码不是那种时间没有改变也输出innerHTML的高消耗代码。innerHTML和style的改变是非常消耗游览器性能的,如果你将来希望