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

让我为你详细讲解一下如何在 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脚本实现数据导出excel格式的简单方法(推荐)

    接下来我将详细讲解“python脚本实现数据导出Excel格式的简单方法(推荐)”实例教程。 1. 简介 本文主要讲解如何使用Python实现将数据导出为Excel格式的简单方法。其中,我们使用第三方库openpyxl来实现数据写入Excel的操作。此外,我们还会介绍pandas库的方式来进行Excel写入。 2. 安装库 首先我们需要安装openpyxl库…

    python 2023年5月13日
    00
  • python获得一个月有多少天的方法

    想要获得一个月有多少天,可以借助datetime库中的date类和calendar库中的monthrange函数。 首先导入需要的库: from datetime import date import calendar 然后定义一个日期变量,指定一个月和年份: year = 2022 month = 3 day = 1 my_date = date(year…

    python 2023年6月2日
    00
  • Python设计模式中的创建型工厂模式

    一、什么是创建型工厂模式? 创建型工厂模式是一种常见的设计模式,它可以在不直接实例化对象的情况下,通过一个工厂函数或者方法来创建对象,隐藏了对象的创建细节,降低了耦合度,提高了代码的可维护性和可扩展性。工厂模式是一种创建型模式,它定义了一个用于创建对象的接口,让子类决定实例化哪个类。工厂模式可以将一个系统中的所有产品共同的处理方式,抽象成一个接口,从而降低系…

    python 2023年5月20日
    00
  • Python 3.8 新功能来一波(大部分人都不知道)

    Python 3.8 新功能来一波 Python 3.8 含有许多新特性和改进,其中大多数人可能没有意识到这些变化。在本文中,我们将重点介绍 Python 3.8 的一些新功能,包括: 更好的调试支持 更简单的表达式语义 更好的异步 I/O 更好的调试支持 Python 3.8 为调试过程提供了更多的支持。 f-Strings 改进 f-Strings 可以…

    python 2023年5月13日
    00
  • python常用的时间模块之datetime模块示例详解

    Python常用的时间模块之datetime模块示例详解 时间是程序设计中非常重要的部分,在Python中,我们使用datetime模块来处理日期和时间。这个模块提供了多个类来处理不同类型的日期和时间数据。本文将详细介绍datetime模块的使用方法和示例。 datetime模块的基本使用 datetime模块提供了3个重要的类:datetime、date和…

    python 2023年6月2日
    00
  • Pandas之read_csv()读取文件跳过报错行的解决

    当使用pandas的read_csv()方法读取文件时,有时候会出现一些行无法正确的被转换为DataFrame对象的情况,此时可能会出现报错或者丢失数据的情况。本文将介绍如何通过读取CSV文件时跳过报错行,从而更好的处理文件。 1. 使用Python内置的csv模块进行文件处理 一个常见的场景是,读取的CSV文件有某些问题,不能按照标准格式读取,导致报错。这…

    python 2023年5月13日
    00
  • 详解超星脚本出现乱码问题的解决方法(Python)

    下面我来详细讲解“详解超星脚本出现乱码问题的解决方法(Python)”。 背景介绍 超星学习通是国内知名在线教育平台,有许多Python编写的爬虫程序用于爬取超星学习通的课程资源。但是在爬取课程资源的时候,经常会遇到乱码问题,导致爬虫程序无法正常运行。那么如何解决该问题呢?下面就来详细讲解。 乱码问题原因 超星学习通网站的编码格式为GBK,而Python默认…

    python 2023年5月20日
    00
  • pip报错“AttributeError: ‘NoneType’ object has no attribute ‘split’”怎么处理?

    当使用 pip 安装 Python 包时,可能会遇到 “AttributeError: ‘NoneType’ object has no attribute ‘split'” 错误。这个错误通常是由于 pip 安装包时出现问题导致的。以下是详细讲解 pip 报错 “AttributeError: ‘NoneType’ object has no attrib…

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