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

2025-06-05 03:50

本文主要是介绍基于Python开发一个有趣的工作时长计算器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可...

概述

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

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

功能介绍

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

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

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

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

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

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

界面展示

1. 主界面

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

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

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

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

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



http://www.chinasem.cn/article/1154909

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达