python PyQt5 数字时钟程序

效果图:

在这里插入图片描述

概述

本文档将指导您如何使用Python的PyQt5库创建一个简单的时钟程序。该程序将显示当前时间,并具有以下特性:

  • 始终在最前台显示。
  • 窗口可拖动。
  • 鼠标右键点击窗口可弹出退出菜单。
  • 时间标签具有红色渐变效果。
  • 窗口初始化时出现在屏幕的右上角。

环境准备

在开始之前,请确保您的Python环境已安装PyQt5库。如果尚未安装,可以通过以下命令安装:

pip install PyQt5

代码解释

导入所需模块

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QMenu, QAction
from PyQt5.QtCore import QTimer, Qt, QPoint
from PyQt5.QtGui import QFont, QPalette, QColor, QLinearGradient, QPainter, QPen
from datetime import datetime

这里导入了PyQt5库中的各种组件,包括应用程序、窗口小部件、布局、定时器、事件处理等。

创建时钟窗口类

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

AlwaysOnTopClock 类继承自 QWidget,是应用程序的主窗口。

初始化用户界面

    def initUI(self):
        # 设置窗口属性,允许拖动和始终在最前
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
        # 设置窗口标题和初始位置、大小
        self.setWindowTitle('始终在最前台显示的时钟')
        self.setGeometry(QApplication.desktop().screen().rect().right() - 300, QApplication.desktop().screen().rect().top() + 10, 300, 80)

这里设置了窗口的基本属性,包括去除边框、始终在最前等。

创建时间标签

        # 创建垂直布局和时间标签
        layout = QVBoxLayout()
        self.time_label = QLabel('00:00:00', self)
        self.setGradient(self.time_label)  # 设置渐变色
        self.time_label.setFont(self.redFont())  # 设置字体为红色
        self.time_label.setAlignment(Qt.AlignCenter)  # 文本居中
        layout.addWidget(self.time_label)

创建了一个 QLabel 用于显示时间,并设置了字体、颜色和布局。

设置渐变色效果

    def setGradient(self, label):
        palette = QPalette(label.palette())
        gradient = QLinearGradient(0, 0, self.width(), 0)
        gradient.setColorAt(0.0, QColor(255, 0, 0, 255))  # 红色
        gradient.setColorAt(1.0, QColor(255, 0, 0, 255))  # 红色
        palette.setBrush(QPalette.WindowText, gradient)
        label.setPalette(palette)
        label.setAlignment(Qt.AlignCenter)

定义了一个渐变效果,使时间标签的文字具有红色渐变色。

更新时间

    def update_time(self):
        now = datetime.now().strftime('%H:%M:%S')
        self.time_label.setText(now)

定义了一个方法来更新时间标签的内容。

窗口绘制事件

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setPen(QPen(Qt.NoPen))
        painter.setBrush(QColor("#333"))  # 设置窗口背景颜色
        painter.drawRect(self.rect())

自定义窗口的绘制,设置窗口背景颜色。

鼠标事件处理

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.dragPos = QPoint(event.globalX() - self.x(), event.globalY() - self.y())

    def mouseMoveEvent(self, event):
        if event.buttons() == Qt.LeftButton:
            self.move(event.globalX() - self.dragPos.x(), event.globalY() - self.dragPos.y())

处理鼠标按下和移动事件,以实现窗口的拖动。

弹出菜单事件,右键退出

    def contextMenuEvent(self, event):
        menu = QMenu(self)
        exitAction = QAction('退出', self)
        exitAction.triggered.connect(QApplication.instance().quit)
        menu.addAction(exitAction)
        menu.exec_(event.globalPos())

定义了鼠标右键点击时弹出的菜单,包含退出选项。

主函数

if __name__ == '__main__':
    app = QApplication(sys.argv)
    screen_geometry = QApplication.desktop().screen().rect()  # 获取屏幕的尺寸
    clock = AlwaysOnTopClock()
    clock.show()  # 显示窗口
    # 将窗口移动到屏幕最右上角
    clock.move(screen_geometry.right() - clock.width(), screen_geometry.top())
    sys.exit(app.exec_())

程序的入口点,创建应用程序实例,初始化时钟窗口,并启动事件循环。

运行程序

保存代码为 py 文件,并在命令行或终端中运行它。您将看到一个始终在最前台显示的时钟窗口,窗口高度为80像素,出现在屏幕的右上角。


完整代码

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QMenu, QAction
from PyQt5.QtCore import QTimer, Qt, QPoint
from PyQt5.QtGui import QFont, QPalette, QColor, QLinearGradient, QPainter, QPen
from datetime import datetime

class AlwaysOnTopClock(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        # 设置窗口属性,允许拖动和始终在最前
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
        self.setWindowTitle('始终在最前台显示的时钟')
        self.setGeometry(QApplication.desktop().screen().rect().right() - 300, QApplication.desktop().screen().rect().top() + 10, 300, 80)  # 设置窗口位置和大小
        # 创建垂直布局和时间标签
        layout = QVBoxLayout()
        self.time_label = QLabel('00:00:00', self)
        self.setGradient(self.time_label)  # 设置渐变色
        self.time_label.setFont(self.redFont())  # 设置字体为红色
        self.time_label.setAlignment(Qt.AlignCenter)  # 文本居中
        layout.addWidget(self.time_label)
        self.setLayout(layout)
        # 创建定时器更新时间
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update_time)
        self.timer.start(1000)  # 每秒更新一次
    def update_time(self):
        now = datetime.now().strftime('%H:%M:%S')
        self.time_label.setText(now)
    def setGradient(self, label):
        palette = QPalette(label.palette())
        gradient = QLinearGradient(0, 0, self.width(), 0)
        gradient.setColorAt(0.0, QColor(255, 0, 0, 255))  # 红色
        gradient.setColorAt(1.0, QColor(255, 0, 0, 255))  # 红色
        palette.setBrush(QPalette.WindowText, gradient)
        label.setPalette(palette)
        label.setAlignment(Qt.AlignCenter)
    def redFont(self):
        font = QFont("Helvetica", 24)  # 根据窗口大小调整字体大小
        font.setBold(True)
        return font
    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setPen(QPen(Qt.NoPen))
        painter.setBrush(QColor("#333"))  # 设置窗口背景颜色
        painter.drawRect(self.rect())
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.dragPos = QPoint(event.globalX() - self.x(), event.globalY() - self.y())
    def mouseMoveEvent(self, event):
        if event.buttons() == Qt.LeftButton:
            self.move(event.globalX() - self.dragPos.x(), event.globalY() - self.dragPos.y())
    def contextMenuEvent(self, event):
        menu = QMenu(self)
        exitAction = QAction('退出', self)
        exitAction.triggered.connect(QApplication.instance().quit)
        menu.addAction(exitAction)
        menu.exec_(event.globalPos())
if __name__ == '__main__':
    app = QApplication(sys.argv)
    screen_geometry = QApplication.desktop().screen().rect()  # 获取屏幕的尺寸
    clock = AlwaysOnTopClock()
    clock.show()  # 显示窗口
    # 将窗口移动到屏幕最右上角
    clock.move(screen_geometry.right() - clock.width(), screen_geometry.top())
    sys.exit(app.exec_())


  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值