python PyQt5 数字时钟程序

news2024/11/16 18:05:09

效果图:

在这里插入图片描述

概述

本文档将指导您如何使用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_())


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1711347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解析智慧物流园区系统的多方位优势

智慧物流园区系统是基于物联网、大数据、人工智能等先进技术的应用系统,旨在实现物流园区的高效、智能化管理。随着物流行业的快速发展,传统物流园区已经无法满足日益增长的需求。智慧物流园区系统的出现填补了现有物流园区管理的空白,带来了…

Windows11系统安装QEMU虚拟化软件

Windows11系统安装QEMU虚拟化软件 QEMU软件是一个通用的开源机器模拟器和虚拟机。本文档适用于在Windows 11系统平台上安装QEMU软件。 1. 安装准备 1.1 安装平台 Windows 11 1.2. 软件信息 软件名称软件版本安装路径QEMUQEMU-8.2.93D:\qemu 1.3软件下载 QEMU官网官网下…

AI办公自动化:kimi批量新建文件夹

工作任务:批量新建多个文件夹,每个文件夹中的年份不一样 在kimi中输入提示词: 你是一个Python编程专家,要完成一个编写关于录制电脑上的键盘和鼠标操作的Python脚本的任务,具体步骤如下: 打开文件夹&…

【鸟叔的Linux私房菜】2-主机规划与磁盘分区

文章目录 2.1 Linux与硬件的搭配各硬件设备在Linux的文件名使用虚拟机学习 2.2 磁盘分区磁盘连接方式和设备文件名的关系MBR(MS-DOS)与GPT磁盘分区表MBR(MS-DOS)GPT磁盘分区表 启动流程的BIOS与UEFI启动检测程序BIOS搭配MBR/GPT的启动流程UEFI BIOS搭配 GPT启动的流程 Linux安装…

解决SSH客户端远程连接CentOS7虚拟机时加载过慢问题

1、编辑 /etc/ssh/sshd_config 文件,将 useDNS 中的 yes 改为 no ,关闭UseDNS加速: vi /etc/ssh/sshd_config2、重启ssh服务: systemctl restart sshd

构建php环境、安装、依赖、nginx配置、ab压力测试命令、添加php-fpm为系统服务

目录 php简介 官网php安装包 选择下载稳定版本 (建议使用此版本,文章以此版本为例) 安装php解析环境 准备工作 安装依赖 zlib-devel 和 libxml2-devel包。 安装扩展工具库 安装 libmcrypt 安装 mhash 安装mcrypt 安装php 选项含…

【Linux】22. 线程控制

Linux线程控制 POSIX线程库 与线程有关的函数构成了一个完整的系列&#xff0c;绝大多数函数的名字都是以“pthread_”打头的 要使用这些函数库&#xff0c;要通过引入头文<pthread.h> 链接这些线程函数库时要使用编译器命令的“-lpthread”选项 线程创建 pthread_cr…

成都爱尔眼科蔡裕主任解说什么是近视性黄斑病变

近视性黄斑病变&#xff0c;属于黄斑病变的其中一种。 黄斑是眼内一个部位&#xff0c;它位于眼底的后极部&#xff0c;视网膜的中心部&#xff0c;管理着光、形、色。黄斑变性是指由于年龄、遗传、不良环境、慢性光损伤等各种因素的影响&#xff0c;使眼部视网膜处的黄斑发生…

kafka-主题创建(主题操作的命令)

文章目录 1、topic主题操作的命令1.1、创建一个3分区1副本的主题1.1.1、获取 kafka-topics.sh 的帮助信息1.1.2、副本因子设置不能超过集群中broker的数量1.1.3、创建一个3分区1副本的主题1.1.4、查看所有主题1.1.5、查看主题详细描述 1、topic主题操作的命令 kafka发送消息会存…

彩光赋能中国智造 极简光3.X助力“数智”转型

蒸汽时代、电气时代、信息时代三大工业革命后 互联网和智能制造主导的工业4.0时代来临 大数据、云计算、人工智能等新兴技术 对企业园区的网络架构、负载能力等 提出了新要求,也使得光纤较于传统铜缆 在距离、性能、延时上的优势日益凸显 基于此 围绕未来园区网建设的企…

【NumPy】深入了解NumPy的multiply函数:高效矩阵和数组乘法指南

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

positivessl泛域名证书500元13个月

随着创建网站的门槛变低&#xff0c;不论是个人用户还是企事业单位用户创建的域名网站也越来越多&#xff0c;怎么维护网络环境的安全成为了各个用户需要解决的问题。为了保护网站的数据安全&#xff0c;防止恶意攻击和数据泄露&#xff0c;大多数用户选择为域名网站安装数字证…

基于51单片机的直流电机调速设计

一.硬件方案 本系统采用STC89C51控制输出数据&#xff0c;由单片机IO口产生PWM信号&#xff0c;送到直流电机&#xff0c;直流电机通过测速电路将实时转速送回单片机&#xff0c;进行转速显示&#xff0c;从而实现对电机速度和转向的控制&#xff0c;达到直流电机调速的目的。…

excel 点击单元格的内容 跳转到其他sheet设置

如图点击1处跳转到2 按照如下图步骤操作即可

【机器学习聚类算法实战-5】机器学习聚类算法之DBSCAN聚类、K均值聚类算法、分层聚类和不同度量的聚集聚类实例分析

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

补环境——A股市场

补环境 吐环境 1.Proxy对象 Proxy对象由两个部分组成&#xff1a;target、handler target:目标对象 handler&#xff1a;是一个对象&#xff0c;声明了代理target的指定行为&#xff0c;支持的拦截操作&#xff0c;一共13种&#xff1a; get(target,propKey,receiver)&…

DataGrip使用ssh连接数据库的操作流程

1 选择数据源种类 2 配置ssh 3 填写host、port和认证方式 我选择的密码方式&#xff0c;也可选择其他方式连接&#xff1a; 本文由博客一文多发平台 OpenWrite 发布&#xff01;

内网安全--隧道技术-MSF上线本地

免责声明:本文仅做技术交流与学习... 不得不说,小白最近也是用上了viper,这里要特别感谢一下my bro 北岭敲键盘的荒漠猫 MSF--viper: --生成马子-->上线 --进入meterpreter. 1-查看路由,添加路由. 查看路由信息 : run autoroute -p run post/multi/manage/autoroute 添加…

PostgreSQL发展史

PostgreSQL是一个开源的对象-关系型数据库管理系统&#xff08;ORDBMS&#xff09;&#xff0c;其历史可以追溯到上世纪80年代。以下是对PostgreSQL发展史的深入解析&#xff1a; 1980年代&#xff1a;起源 1.Ingres 项目 1977年&#xff0c;Michael Stonebraker 和他的团队…

数字信号处理实验三:IIR数字滤波器设计及软件实现

一、实验目的 1. 掌握MATLAB中进行IIR模拟滤波器的设计的相关函数的应用&#xff1b; 2. 掌握MATLAB的工具箱中提供的常用IIR数字滤波器的设计函数的应用&#xff1b; 3.掌握MATLAB的工具箱中提供的模拟滤波器转数字滤波器的相关的设计函数的应用。 二、实验内容 本实验为…