本文主要是介绍基于Python开发一个有趣的工作时长计算器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可...
概述
随着远程办公和弹性工作制的兴起GBHyhI,个人及团队对于工作时长的准确统计需求日益增长。虽然市面上有众多复杂的考勤软件,但对于简单的时间计算需求,一个轻量级且界面友好的桌面应用更具实用性和便利性。
本文介绍的“工作时长计算器”基于python的PyQt5库开发,体积小巧,界面简洁,支持用户输入上下班时间,一键计算出当天工作时长,并可将结果复制到剪贴板,方便粘贴到日报、考勤系统或聊天工具中。
功能介绍
输入上下班时间(HH:MM格式)
自动计算并显示工作时长,支持跨天工作时段
复制工作时长到剪贴板,一键分享
窗口置顶功能,方便随时查看和操作
友好的错误提示,避免无效时间格式输入
自定义窗口图标与样式美化,提升用户体验
界面展示
1. 主界面

图1:工作时长计算器主界面,简洁明了,支持键盘输入与按钮操作
2. 计算结果显示与复制反馈

图2:计算完成后显示时长,点击复制按钮弹出提示
软件使用步骤说明
启动程序:运行python work_time_calculator.py
输入上班时间:如08:30
输入下班时间:如17:45
点击“计算工作时长”按钮,显示工作时长,例如08:15
点击“复制时长”按钮,将结果复制到剪贴板,方便粘贴
勾选“窗口置顶”,保持程序界面在最前端
如输入格式错误,弹出错误提示框,请按提示修改时间格式
代码详解
1.窗口初始化与布局
class WorkTimeCalculator(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("工作时长计算器")
self.setFixedSize(320, 380)
# 设置窗口图标
icon_path = self.resource_path("time.ico")
self.setWindowIcon(QIcon(icon_path))
# 窗口置顶属性
self.setWindowFlags(self.windowFlags() | Qt.WindowstaysOnTopHint)
self.duration_str = ""
self.init_ui()
- QWidget是PyQt中最基础的窗口类。
- 固定窗口大小,保证UI布局一致性。
- 使用自定义图标美化程序。
- 通过Qt.WindowStaysOnTopHint保持窗口置顶。
UI组件布局采用QvboxLayout垂直堆叠控件,样式使用QFont和setStyleSheet增强视觉体验。
2.工作时长计算核心逻辑
def calculate_time(self):
start_text = self.input_start.text().strip()
end_text = self.input_end.text().strip()
try:
start_time = datetime.strptime(start_text, "%H:%M")
end_time = datetime.strptime(end_text, "%H:%M")
if end_time < start_time:
end_time = end_time.replace(day=start_time.day + 1)
duration = end_time - start_time
total_minutes = duration.seconds // 60
hours = total_minutes // 60
minutes = total_minutes % 60
self.duration_str = f"{hours:02}:{minutes:02}"
self.result_label.setText(f" 工作时长:{self.duration_str}")
except ValueError:
QMessageBox.warning(self, "❌ 错误", "请输入有效时间格式,如 0javascript9:00")
使用datetime.strptime解析输入时间。
处理跨天工作(如夜班,结束时间小于开始时间时,自动视为第二天)。
计算时间差,转换成小时和分钟。
结果格式化为HH:MM,更新界面标签显示。
异常处理避免程序崩溃,弹出错误提示框。
3.剪贴板复制与状态提示
def copy_duration(self):
if self.duration_str:
QApplication.clipboard().setText(self.duration_str)
self.show_status_message(f"⏱️ 时长 {self.duration_str} 已复制到剪贴板", 1200)
else:
QMessageBox.warning(self, "⚠️ 无数据", "请先计算工作时长")
def show_status_message(self, message, timeout=1000):
self.status_label.setText(message)
self.status_label.setVisible(True)
QTimer.singleShot(timeout, lambda: self.status_label.setVisible(False))
复制时长字符串到系统剪贴板。
使用状态栏显示短暂提示,提升用户交互体验。
未计算前复制操作给出警告提示。
4.窗口置顶功能
def toggle_topmost(self, state):
if state == Qt.Checked:
self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint)
else:
self.setWindowFlags(self.windowFlags() & ~Qt.WindowStaysOnTopHint)
self.show()
通过QCheckBox切换窗口置顶属性。
动态刷新窗口状态,确保设置生效。
源码下载
import sys
import os
from PyQt5.QtWidgets import (
QApplication, QWidget, QLabel, QLineEdit, QPushButton,
QVBoxLayout, QMessageBox, QCheckBox
)
from PyQt5.QtGui import QFont, QIcon
from PyQt5.QtCore import Qt, QTimer
from datetime import datetime
class WorkTimeCalculator(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("工作时长计算器")
self.setFixedSize(320, 380)
# 设置窗口图标
icon_path = self.resource_path("time.ico")
self.setWindowIcon(QIcon(icon_path))
self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint)
self.duration_str = ""
self.init_ui()
def init_ui(self):
font = QFont("Arial", 12)
self.label_start = QLabel(" 上班时间 (HH:MM):")
self.label_start.setFont(font)
self.input_start = QLineEdit()
self.input_start.setPlaceholderText("如:08:30")
self.input_start.setFont(font)
self.input_start.setStyleSheet("""
QLineEdit {
border: 2px solid #ccc;
border-radius: 10px;
padding: 6px 10px;
}
""")
self.label_end = QLabel(" 下班时间 (HH:MM):")
self.label_end.setFont(font)
self.input_end = QLineEdit()
self.input_end.setPlaceholderText("如:17:45")
self.input_end.setFont(font)
self.input_end.setStyleSheet("""
QLineEdit {
border: 2px solid #ccc;
border-radius: 10px;
padding: 6px 10px;
}
""")
self.button_calc = QPushButton("✅ 计算工作时长")
self.button_calc.setFont(font)
self.button_calc.setStyleSheet("""
QPushButton {
background-color: #4CAF50;
color: white;
border: none;
border-radius: 10px;
padding: 8px;
}
QPushButton:hover {
background-color: #45a049;
}
QPushButton:pressed {
background-color: #3e8e41;
}
""")
self.button_calc.clicked.connect(self.calculate_time)
self.result_label = QLabel(" 工作时长:--:--")
self.result_label.setFont(QFont("Arial", 13, QFont.Bold))
self.copy_button = QPushButton(" 复制时长")
self.copy_button.setFont(font)
self.copy_button.setStyleSheet("""
QPushButton {
background-color: #2196F3;
color: white;
border: none;
border-radius: 10px;
padding: 8px;
}
QPushButton:hover {
background-color: #1e88e5;
}
QPushButton:pressed {
background-color: #1976d2;
}
""")
self.copy_button.clicked.connect(self.copy_duration)
self.checkbox_topmost = QCheckBox(" 窗口置顶")
self.checkbox_topmost.setFont(font)
self.checkbox_topmost.setChecked(True)
self.checkbox_topmost.stateChanged.connect(self.toggle_topmost)
sejslf.status_label = QLabel("")
self.status_label.setFont(QFont("Arial", 10))
self.status_label.setStyleSheet("color: white; background-color: #444; padding: 4px; border-radius: 4px;")
self.status_label.setAlignment(Qt.AlignCenter)
self.status_label.setVisible(False)
layout = QVBoxLayout()
layout.setSpacing(8)
layout.setContentsMargins(16, 16, 16, 16)
layout.addwidget(self.label_start)
layout.addWidget(self.input_start)
layout.addWidget(self.label_end)
layout.addWidget(self.input_end)
layout.addWidget(self.button_calc)
layout.addWidget(self.result_label)
layout.addWidget(self.copy_button)
layout.addWidget(self.checkbox_topmost)
layout.addWidget(self.status_label)
self.setLayout(layout)
def calculate_time(self):
start_text = self.input_start.text().strip()
end_text = self.input_end.text().strip()
try:
start_time = datetime.strptime(start_text, "%H:%M")
end_time = datetime.strptime(end_text, "%H:%M")
if end_time < start_time:
end_time = end_time.replace(day=start_time.day + 1)
duration = end_time - start_time
total_minutes = duration.seconds // 60
hours = total_minutes // 60
minutes = total_minutes % 60
self.duration_str = f"{hours:02}:{minutes:02}"
self.result_label.setText(f" 工作时长:{self.duration_str}")
except ValueError:
QMessageBox.warning(self, "❌ 错误", "请输入有效时间格式,如 09:00")
def copy_duration(self):
if self.duration_str:
QApplication.clipboard().setText(self.duration_str)
self.show_status_message(f"⏱️ 时长 {self.duration_str} 已复制到剪贴板", 1200)
GBHyhI else:
QMessageBox.warning(self, "⚠️ 无数据", "请先计算工作时长")
def show_status_message(self, message, timeout=1000):
self.status_label.setText(message)
self.status_label.setVisible(True)
QTimer.singleShot(timeout, lambda: self.status_label.setVisible(False))
def toggle_topmost(self, state):
if state == Qt.Checked:
self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint)
else:
self.setWindowFlags(self.windowFlags() & ~Qt.WindowStaysOnTopHint)
self.show()
def resource_path(self, relative_path):
"""解决打包后资源路径问题"""
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath("."), relative_path)
if __name__ == "__main__":
app = QApplication(sys.argv)
app.setStyle("Fusion")
window = WorkTimeCalculator()
window.show()
sys.exit(app.exec_())
总结与展望
本文详细介绍了基于PyQt5的“工作时长计算器”的开发过程,涵盖了窗口设计、时间处理逻辑、交互细节及用户体验优化。该工具简单实用,适合日常办公人员快速统计工作时长。
未来可以拓展的功能有:
- 支持批量导入多天时间记录,自动生成日报
- 增加午休、加班等特殊时段计算支持
- 导出统计报表(Excel、PDF等格式)
- 美化UI,支持多语言切换和主题模式
到此这篇关于基于Python开发一个有趣的工作时长计算器的文章就介绍到这了,更多相关Python工作时长计算器内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!
这篇关于基于Python开发一个有趣的工作时长计算器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!