基于Python开发一个有趣的工作时长计算器

Written by

in

文章目录
  • 随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长。虽然市面上有众多复杂的考勤软件,但对于简单的时间计算需求,一个轻量级且界面友好的桌面应用更具实用性和便利性。 本文介绍的“工作时长计算器”基于Python的PyQt5库开发,体积小巧,界面简洁,支持用户输入上下班时间,一键计算出当天工作时长,并可将结果复制到剪贴板,方便粘贴到日报、考勤系统或聊天工具中。
  • 输入上下班时间(HH:MM格式) 自动计算并显示工作时长,支持跨天工作时段 复制工作时长到剪贴板,一键分享 窗口置顶功能,方便随时查看和操作 友好的错误提示,避免无效时间格式输入 自定义窗口图标与样式美化,提升用户体验
  • 1. 主界面 图1:工作时长计算器主界面,简洁明了,支持键盘输入与按钮操作 2. 计算结果显示与复制反馈 图2:计算完成后显示时长,点击复制按钮弹出提示
  • 启动程序:运行python work_time_calculator.py 输入上班时间:如08:30 输入下班时间:如17:45 点击“计算工作时长”按钮,显示工作时长,例如08:15 点击“复制时长”按钮,将结果复制到剪贴板,方便粘贴 勾选“窗口置顶”,保持程序界面在最前端 如输入格式错误,弹出错误提示框,请按提示修改时间格式
  • 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) self.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) 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工作时长计算器内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: python根据距离和时长计算配速示例 python 获取毫秒数,计算调用时长的方法 Python实现有趣的亲戚关系计算器 Python模拟实现全功能贷款计算器 基于Python制作股票交易计算器 Python实现计算机时长管理程序
  • 目录
    • 概述
    • 功能介绍
    • 界面展示
    • 软件使用步骤说明
    • 代码详解
      • 1.窗口初始化与布局
      • 2.工作时长计算核心逻辑
      • 3.剪贴板复制与状态提示
      • 4.窗口置顶功能
    • 源码下载
      • 总结与展望

        随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长。虽然市面上有众多复杂的考勤软件,但对于简单的时间计算需求,一个轻量级且界面友好的桌面应用更具实用性和便利性。

        本文介绍的“工作时长计算器”基于Python的PyQt5库开发,体积小巧,界面简洁,支持用户输入上下班时间,一键计算出当天工作时长,并可将结果复制到剪贴板,方便粘贴到日报、考勤系统或聊天工具中。

        输入上下班时间(HH:MM格式)

        自动计算并显示工作时长,支持跨天工作时段

        复制工作时长到剪贴板,一键分享

        窗口置顶功能,方便随时查看和操作

        友好的错误提示,避免无效时间格式输入

        自定义窗口图标与样式美化,提升用户体验

        1. 主界面

        图1:工作时长计算器主界面,简洁明了,支持键盘输入与按钮操作

        2. 计算结果显示与复制反馈

        图2:计算完成后显示时长,点击复制按钮弹出提示

        启动程序:运行python work_time_calculator.py

        输入上班时间:如08:30

        输入下班时间:如17:45

        点击“计算工作时长”按钮,显示工作时长,例如08:15

        点击“复制时长”按钮,将结果复制到剪贴板,方便粘贴

        勾选“窗口置顶”,保持程序界面在最前端

        如输入格式错误,弹出错误提示框,请按提示修改时间格式

        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增强视觉体验。

        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")
        

        使用datetime.strptime解析输入时间。

        处理跨天工作(如夜班,结束时间小于开始时间时,自动视为第二天)。

        计算时间差,转换成小时和分钟。

        结果格式化为HH:MM,更新界面标签显示。

        异常处理避免程序崩溃,弹出错误提示框。

        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))
        

        复制时长字符串到系统剪贴板。

        使用状态栏显示短暂提示,提升用户交互体验。

        未计算前复制操作给出警告提示。

        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)
        
                self.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)
                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工作时长计算器内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

        您可能感兴趣的文章:

        • python根据距离和时长计算配速示例
        • python 获取毫秒数,计算调用时长的方法
        • Python实现有趣的亲戚关系计算器
        • Python模拟实现全功能贷款计算器
        • 基于Python制作股票交易计算器
        • Python实现计算机时长管理程序

        站内搜索