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自动化操作之动态验证码、滑动验证码的降噪和识别

    Python自动化操作之动态验证码、滑动验证码的降噪和识别 什么是动态验证码和滑动验证码? 动态验证码和滑动验证码是常见的防止自动化操作的方式。动态验证码是指,验证码在输入之前会动态地改变,比如验证码的旋转角度、字体颜色等。滑动验证码是指,用户需要将图片中的某一个小块通过拖动的方式移动到正确的位置才能够通过验证。 如何降噪和识别动态验证码和滑动验证码? 1.…

    python 2023年6月6日
    00
  • Python3+selenium配置常见报错解决方案

    当我们使用Python3和Selenium进行自动化测试时,可能会遇到一些常见的配置错误。这些错误可能会导致我们无法正常运行测试脚本。本攻略将介绍一些常见的配置错误以及如何解决它们。 环境配置 在开始使用Selenium之前,我们需要确保我们的环境已经正确配置。以下是一些必要的配置: 安装Python3 安装Selenium 安装浏览器驱动程序 安装Pyth…

    python 2023年5月13日
    00
  • Python数据可视化 pyecharts实现各种统计图表过程详解

    Python数据可视化pyecharts实现各种统计图表过程详解 数据可视化是数据分析中非常重要的一部分,它可以帮助我们更好地理解和分析数据。Python提供了一些强大的数据可视化工具,其中pyecharts是一个非常流行的工具,它可以帮助我们轻松地创建各种统计图表。本文将详细讲解如何使用pyecharts实现各种统计图表。 安装pyecharts 在使用p…

    python 2023年5月15日
    00
  • 如何使用Python读取.xlsx指定行列

    下面是关于如何使用Python读取.xlsx指定行列的详细教程: 1. 安装所需的库 使用Python读取Excel需要用到三个库:openpyxl、pandas和xlrd。其中,openpyxl主要用于写入和读取Excel,pandas可以更方便的实现数据处理和一些操作,xlrd主要是用于旧版本的Excel的读取,如果你只打算读取.xlsx格式的文件,xl…

    python 2023年5月13日
    00
  • python 二维数组90度旋转的方法

    下面是针对“Python 二维数组90度旋转”的完整攻略: 分析问题 要对二维数组进行90度旋转,我们需要按照顺时针方向将数组中的每个元素挪动到新的位置。对于一个N×N的二维数组而言,我们可以先将整个数组分成四个以中心点为界的矩形,然后按照顺时针方向将每个矩形中的元素挪动到新位置。 解决方案 我们可以定义一个函数,接受一个二维数组作为参数,并返回旋转后的新数…

    python 2023年6月5日
    00
  • pip报错“OSError: [Errno 1] Operation not permitted: ‘/tmp/pip-uninstall-…’”怎么处理?

    当使用 pip 安装 Python 包时,可能会遇到 “OSError: [Errno 1] Operation not permitted: ‘/tmp/pip-uninstall-…'” 错误。这个错误通常是由于权限问题导致的。以下是详细讲解 pip 报错 “OSError: [Errno 1] Operation not permitted: ‘/…

    python 2023年5月4日
    00
  • 如何使用 Redis 存储和检索数据?

    如何使用 Redis 存储和检索数据? Redis 是一个开源的内存数据结构存储系统,它支持多种数据结构,如字符串、哈希、列表、集合等。Redis 常用于缓存、消息队列实时数据处理等场景。在本文中,我们将介绍如何使用 Redis 存储和检索数据的整使用攻略,包括连接 Redis 数据库、设置和获取键值对、使用哈希、列表和集合等数据结构、发布和订阅消息操作。 …

    python 2023年5月12日
    00
  • 用python 制作图片转pdf工具

    下面是使用 Python 制作图片转 PDF 工具的完整攻略: 步骤一:安装必要的Python库 在使用 Python 制作图片转 PDF 工具前,需要安装必要的 Python 库。可以通过 pip 命令安装,例如: pip install pillow pip install img2pdf 其中,pillow 库用于图片处理,img2pdf 库用于将图片…

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