Python中利用pyqt5制作指针钟表显示实时时间(指针时钟)

yizhihongxing

让我为你详细讲解一下如何在 Python 中使用 PyQt5 库制作指针时钟显示实时时间。

1. 创建 Qt 应用程序

首先,需要导入 PyQt5 库和系统时间模块,然后创建一个 Qt 应用程序。

import sys
import datetime
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QColor, QPen
from PyQt5.QtCore import Qt, QTimer

class Clock(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 250, 250)
        self.setWindowTitle('Clock')
        self.timer = QTimer()
        self.timer.timeout.connect(self.update)
        self.timer.start(1000)
        self.show()

在 initUI() 方法中,我们设置窗口的初始位置和大小,设置窗口标题,创建一个 QTimer 对象,用于定时刷新窗口,设置定时器的超时信号,最后启动定时器并显示窗口。

2. 绘制时钟表盘

接下来,需要在窗口上绘制时钟表盘。可以重写 QWidget 类的 paintEvent() 方法来完成绘制。

class Clock(QWidget):
    ...
    def paintEvent(self, event):
        qp = QPainter()
        qp.begin(self)
        self.drawClock(qp)
        qp.end()

    def drawClock(self, qp):
        size = self.size()
        side = min(size.width(), size.height())

        qp.setRenderHint(QPainter.Antialiasing)
        qp.translate(size.width() / 2, size.height() / 2)
        qp.scale(side / 200, side / 200)

        pen = QPen(Qt.black, 1, Qt.SolidLine)
        qp.setPen(pen)

        font = qp.font()
        font.setPixelSize(15)
        qp.setFont(font)

        for i in range(60):
            if (i % 5) == 0:
                qp.drawLine(84, 0, 96, 0)
            else:
                qp.drawLine(90, 0, 96, 0)
            qp.rotate(6)

我们首先获取窗口的尺寸 size 和其中的较小边 side,然后将 QPainter 坐标系统的原点移动到窗口中心,对 QPainter 进行缩放,使得绘制的图形可以适应窗口大小,设置画笔颜色、线宽和线型,设置字体大小,然后在循环中绘制刻度线,并将 QPainter 顺时针旋转 6 度,以绘制下一个刻度线,最终完成绘制时钟表盘的过程。

3. 绘制指针

接下来,需要在窗口上绘制指针,并将指针与实时时间相关联。

class Clock(QWidget):
    ...
    def drawClock(self, qp):
        self.drawHour(qp)
        self.drawMinute(qp)
        self.drawSecond(qp)

    def drawHour(self, qp):
        hour = datetime.datetime.now().hour
        minute = datetime.datetime.now().minute
        angle = ((hour % 12) + minute / 60.0) * 30.0
        qp.save()
        qp.rotate(angle)
        qp.drawLine(-20, 0, 30, 0)
        qp.restore()

    def drawMinute(self, qp):
        minute = datetime.datetime.now().minute
        angle = minute * 6.0
        qp.save()
        qp.rotate(angle)
        qp.drawLine(-30, 0, 50, 0)
        qp.restore()

    def drawSecond(self, qp):
        second = datetime.datetime.now().second
        angle = second * 6.0
        qp.save()
        qp.rotate(angle)
        pen = QPen(Qt.red, 1, Qt.SolidLine)
        qp.setPen(pen)
        qp.drawLine(-35, 0, 60, 0)
        qp.restore()

我们分别实现绘制时针、分针和秒针的 drawHour()、drawMinute() 和 drawSecond() 方法。在这些方法中,我们首先获取当前的小时、分钟和秒数,然后根据它们计算指针的角度,绘制指针,并将 QPainter 根据指针角度顺时针旋转。最后,我们贴上实时更新秒针颜色的代码段。

4. 完整代码示例

下面是完整的 Python 代码示例。

import sys
import datetime
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QColor, QPen
from PyQt5.QtCore import Qt, QTimer

class Clock(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 250, 250)
        self.setWindowTitle('Clock')
        self.timer = QTimer()
        self.timer.timeout.connect(self.update)
        self.timer.start(1000)
        self.show()

    def paintEvent(self, event):
        qp = QPainter()
        qp.begin(self)
        self.drawClock(qp)
        qp.end()

    def drawClock(self, qp):
        self.drawHour(qp)
        self.drawMinute(qp)
        self.drawSecond(qp)

        size = self.size()
        side = min(size.width(), size.height())

        qp.setRenderHint(QPainter.Antialiasing)
        qp.translate(size.width() / 2, size.height() / 2)
        qp.scale(side / 200, side / 200)

        pen = QPen(Qt.black, 1, Qt.SolidLine)
        qp.setPen(pen)

        font = qp.font()
        font.setPixelSize(15)
        qp.setFont(font)

        for i in range(60):
            if (i % 5) == 0:
                qp.drawLine(84, 0, 96, 0)
            else:
                qp.drawLine(90, 0, 96, 0)
            qp.rotate(6)

    def drawHour(self, qp):
        hour = datetime.datetime.now().hour
        minute = datetime.datetime.now().minute
        angle = ((hour % 12) + minute / 60.0) * 30.0
        qp.save()
        qp.rotate(angle)
        qp.drawLine(-20, 0, 30, 0)
        qp.restore()

    def drawMinute(self, qp):
        minute = datetime.datetime.now().minute
        angle = minute * 6.0
        qp.save()
        qp.rotate(angle)
        qp.drawLine(-30, 0, 50, 0)
        qp.restore()

    def drawSecond(self, qp):
        second = datetime.datetime.now().second
        angle = second * 6.0
        qp.save()
        qp.rotate(angle)
        pen = QPen(Qt.red, 1, Qt.SolidLine)
        qp.setPen(pen)
        qp.drawLine(-35, 0, 60, 0)
        qp.restore()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    clock = Clock()
    sys.exit(app.exec_())

运行上述代码,即可在窗口中看到指针时钟实时显示当前时间。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python中利用pyqt5制作指针钟表显示实时时间(指针时钟) - Python技术站

(0)
上一篇 2023年6月2日
下一篇 2023年6月2日

相关文章

  • Python高阶函数map() 简介和使用详解

    Python高阶函数map() 简介和使用详解 在Python中,map()是一个非常重要的高阶函数,它能够对可迭代对象的所有元素进行某种操作,并返回一个新的可迭代对象。map()方法通常可以代替for循环完成某些迭代操作,同时能大大提高代码的简洁度和可读性。 map()方法的语法 map(function, iterable, …) function:…

    python 2023年6月3日
    00
  • QT布局管理详解QVBoxLayout与QHBoxLayout及QGridLayout的使用

    下面是关于“QT布局管理详解QVBoxLayout与QHBoxLayout及QGridLayout的使用”的完整攻略。 布局管理器简介 QT布局管理器是QT GUI 设计界面中最重要的一部分,用于帮助开发者处理 Widget(QWidget)之间的布局关系,控制控件在可用空间中的大小、位置、对齐方式等。 在 QT 中,布局管理器主要由 QVBoxLayout…

    python 2023年6月13日
    00
  • Python使用pygame模块编写俄罗斯方块游戏的代码实例

    下面,我将为您提供详细讲解“Python使用pygame模块编写俄罗斯方块游戏的代码实例”的完整攻略。 准备工作 在实现这个项目之前,需要先安装pygame模块,可以使用如下命令进行安装: pip install pygame 游戏的主要实现过程 在这个游戏中,我们需要实现以下几个部分: 初始化游戏界面 实现俄罗斯方块的随机生成 实现俄罗斯方块的移动和变形 …

    python 2023年5月13日
    00
  • Python爬虫实现HTTP网络请求多种实现方式

    Python爬虫实现HTTP网络请求多种实现方式 在Python爬虫中,对HTTP网络请求的处理非常重要,实现了HTTP网络请求后可以从互联网上抓取所需的数据。在Python中,我们可以使用多种方式实现HTTP网络请求,这里为大家介绍一些常见的方式。 使用urllib库 urllib是Python标准库中一个HTTP请求处理库,可以轻松地通过urllib库实…

    python 2023年5月14日
    00
  • Python实现多任务进程示例

    这里是Python实现多任务进程示例的完整攻略。 1. 多任务进程简介 多任务进程可以同时运行多个程序,这些程序是相互独立的,互不干扰,可以充分利用计算机的资源。在Python中实现多任务进程有两种方式,分别是多进程和多线程。 2. 多进程实现多任务 2.1 创建进程 在Python中,可以通过multiprocessing模块来创建多个进程来实现多任务。下…

    python 2023年5月19日
    00
  • 解决python中使用plot画图,图不显示的问题

    当使用Python中的Matplotlib库绘制图形时,经常遇到图形显示不出来,只显示出一个空白的窗口的问题。这个问题通常是由于缺少已安装的GUI库或绘图代码中缺少正确的显示代码导致的。下面是解决这个问题的完整攻略: 确保正确的环境配置和库的安装 在使用Matplotlib库绘图之前,需要确保已经正确地安装了Matplotlib库和相关GUI库。对于Wind…

    python 2023年5月19日
    00
  • Python算法应用实战之队列详解

    Python算法应用实战之队列详解 队列的定义 队列(Queue)是一种在队尾添加元素,从队头删除元素的数据结构。它遵循“后进先出(LIFO)”的原则,在Python中使用列表(List)来模拟队列。 队列的操作 队列的基本操作如下:- 初始化队列:创建一个空列表,作为队列的容器- 入队操作:将元素添加至队列的末尾- 出队操作:从队列的头部删除一个元素并返回…

    python 2023年5月13日
    00
  • Python打开文件,将list、numpy数组内容写入txt文件中的方法

    Python打开文件,将list、numpy数组内容写入txt文件中的方法 在Python中,我们可以使用open()函数打开文件,并将list、numpy数组等内容写入txt文件中。本文将详细讲解Python打开文件将list、numpy数组内容写入txt文件中的方法,包括打开文件、写入内容、关闭文件等方面的内容,并给出两个示例说明。 打开文件 在Pyth…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部