关于python:动态指针时钟利用pyqt5制作指针钟表显示实时时间

11次阅读

共计 3281 个字符,预计需要花费 9 分钟才能阅读完成。

【浏览全文】

文末附残缺源代码实现过程 …

想实现这样一个性能,而后 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_()

公众号内回复 ” 动静时钟 ”,获取残缺源代码。

【往期精选】

python 日志中最亮的仔,是喜爱的花里胡哨吖 …

hashlib.md5() 函数来筛选出零碎反复文件并移除 …

哈撒给,英雄联盟全皮肤下载器来了 …

PyQt5 的敏感词检测工具制作,运营者的福音 …

手绘图片生成器:以雪容融为例一键生成 …

刚刚出炉的冬奥会吉祥物:冰墩墩,附源码 …

最柔美的表格查看插件:tabulate

抖音同款课堂点名零碎,PyQt5 写起来很简略 …

动工啦!批量向 PDF 文件增加中文水印 …

大年初二、做了一个 windows 告诉管理器!

百度图片下载器 2.0

gif 动静图片生成器,多张图片组合后生成动图 …

正文完
 0