本文主要是介绍基于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开发一个有趣的工作时长计算器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!