效果图:
概述
本文档将指导您如何使用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_())