Python+PyQt5打造一个代码行数统计工具

 更新时间:2025年10月26日 09:49:50   作者:小庄-Python办公  
作为一名开发者,你是否经常需要统计项目中的代码行数,是否厌倦了使用命令行工具或者在线工具的繁琐操作,下面我们就来使用Python开发一款代码行数统计工具吧

前言

作为一名开发者,你是否经常需要统计项目中的代码行数?是否厌倦了使用命令行工具或者在线工具的繁琐操作?今天,我将分享如何使用PyQt5开发一款功能强大、界面美观的Python代码行数统计工具。

项目背景

在日常开发中,我们经常需要:

  • 统计项目的代码规模
  • 分析代码质量(代码行vs注释行比例)
  • 生成项目报告
  • 快速了解项目结构

传统的解决方案往往存在以下问题:

  • 命令行工具操作复杂
  • 在线工具需要上传代码(安全隐患)
  • 功能单一,缺乏可视化
  • 不支持批量处理

因此,我决定开发一款集成度高、操作简便的图形化工具。

技术选型

为什么选择PyQt5

  • 跨平台支持 - 一次开发,多平台运行
  • 丰富的组件 - 提供完整的GUI组件库
  • 成熟稳定 - 经过多年发展,稳定性极佳
  • Python生态 - 与Python完美集成
  • 现代化界面 - 支持样式表,可以打造美观界面

核心技术栈

  • GUI框架: PyQt5
  • 多线程: QThread(避免界面卡顿)
  • 文件处理: Python标准库
  • 正则表达式: 智能识别注释和代码

功能设计

核心功能

1.拖拽支持

  • 支持拖拽单个或多个.py文件
  • 支持拖拽目录(自动递归扫描)
  • 直观的拖拽区域设计

2.智能统计

  • 准确识别代码行、注释行、空行
  • 支持单行注释(#)
  • 支持多行注释(“”"或’‘’)
  • 正确处理行末注释

3.批量处理

  • 多线程处理,避免界面卡顿
  • 实时进度显示
  • 支持大型项目扫描

4.结果展示

  • 树形结构显示文件和目录
  • 详细的统计信息
  • 目录汇总功能

5.导出功能

  • 支持导出统计结果
  • 文本格式,便于分享

完整效果图 

核心代码实现

1. 代码行数统计算法

@staticmethod
def count_lines(file_path: str) -> Dict[str, int]:
    """智能统计代码行数"""
    try:
        with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
            lines = f.readlines()
    except Exception:
        return {'total': 0, 'code': 0, 'comment': 0, 'blank': 0}
    
    total_lines = len(lines)
    code_lines = 0
    comment_lines = 0
    blank_lines = 0
    
    in_multiline_string = False
    multiline_quote = None
    
    for line in lines:
        stripped = line.strip()
        
        # 空行处理
        if not stripped:
            blank_lines += 1
            continue
        
        # 多行字符串处理
        if in_multiline_string:
            if multiline_quote in stripped:
                quote_count = stripped.count(multiline_quote)
                if quote_count % 2 == 1:
                    in_multiline_string = False
                    multiline_quote = None
            comment_lines += 1
            continue
        
        # 检查多行字符串开始
        if '"""' in stripped or "'''" in stripped:
            # ... 处理逻辑
        
        # 单行注释
        if stripped.startswith('#'):
            comment_lines += 1
            continue
        
        # 代码行
        code_lines += 1
    
    return {
        'total': total_lines,
        'code': code_lines,
        'comment': comment_lines,
        'blank': blank_lines
    }

2. 拖拽功能实现

class DropArea(QLabel):
    """支持拖拽的区域"""
    files_dropped = pyqtSignal(list)
    
    def __init__(self):
        super().__init__()
        self.setAcceptDrops(True)
        self.setAlignment(Qt.AlignCenter)
        # 设置样式和提示文本
    
    def dragEnterEvent(self, event: QDragEnterEvent):
        if event.mimeData().hasUrls():
            event.acceptProposedAction()
            # 更新视觉反馈
    
    def dropEvent(self, event: QDropEvent):
        files = []
        for url in event.mimeData().urls():
            file_path = url.toLocalFile()
            if os.path.exists(file_path):
                files.append(file_path)
        
        if files:
            self.files_dropped.emit(files)

3. 多线程处理

class CounterThread(QThread):
    """后台统计线程"""
    progress_updated = pyqtSignal(int, int)
    file_processed = pyqtSignal(str, dict)
    directory_processed = pyqtSignal(str, dict)
    finished = pyqtSignal()
    
    def run(self):
        # 收集所有文件
        all_files = []
        for path in self.paths:
            if os.path.isfile(path) and path.endswith('.py'):
                all_files.append(path)
            elif os.path.isdir(path):
                py_files = self.counter.scan_directory(path)
                all_files.extend(py_files)
        
        # 逐个处理文件
        for i, file_path in enumerate(all_files):
            stats = self.counter.count_lines(file_path)
            self.file_processed.emit(file_path, stats)
            self.progress_updated.emit(i + 1, len(all_files))

界面设计亮点

1. 现代化样式

使用CSS样式表打造现代化界面:

self.setStyleSheet("""
    QMainWindow {
        background-color: #f5f5f5;
    }
    QPushButton {
        background-color: #0078d4;
        color: white;
        border: none;
        padding: 8px 16px;
        border-radius: 4px;
        font-weight: bold;
    }
    QPushButton:hover {
        background-color: #106ebe;
    }
""")

2. 响应式布局

  • 使用QSplitter实现可调整的分割布局
  • 自适应窗口大小
  • 合理的组件间距和对齐

3. 用户体验优化

  • 拖拽时的视觉反馈
  • 进度条显示处理进度
  • 清晰的状态提示
  • 快捷键支持

项目特色

1. 智能识别算法

相比简单的行数统计,本工具能够:

  • 正确识别Python的多行字符串
  • 区分文档字符串和普通注释
  • 处理复杂的注释嵌套情况
  • 支持不同的引号格式

2. 性能优化

  • 多线程处理,避免界面卡顿
  • 内存优化,支持大型项目
  • 异常处理,确保程序稳定性
  • 编码自动检测,兼容性强

3. 用户友好

  • 直观的拖拽操作
  • 清晰的结果展示
  • 完善的错误提示
  • 详细的使用说明

使用场景

1. 项目评估

快速了解项目规模

分析代码质量

生成项目报告

2. 代码审查

检查注释覆盖率

评估代码文档化程度

识别冗余代码

3. 团队协作

统一代码规范

制定开发计划

设定质量目标

安装和使用

环境要求

  • Python 3.6+
  • PyQt5

安装步骤

# 1. 克隆项目
git clone [项目地址]

# 2. 安装依赖
pip install PyQt5

# 3. 运行程序
python code_counter.py

使用方法

  • 启动程序
  • 拖拽文件或目录到拖拽区域
  • 查看统计结果
  • 导出报告(可选)

技术难点与解决方案

1. 多行字符串识别

难点: Python的多行字符串可能跨越多行,需要正确识别开始和结束位置。

解决方案: 使用状态机模式,跟踪当前是否在多行字符串内部。

2. 编码问题

难点: Python文件可能使用不同的编码格式。

解决方案: 优先使用UTF-8,失败时使用errors='ignore’参数。

3. 性能优化

难点: 大型项目包含大量文件,可能导致界面卡顿。

解决方案: 使用QThread进行后台处理,通过信号更新界面。

未来规划

短期目标

  • 支持更多编程语言
  • 添加代码复杂度分析
  • 支持自定义统计规则

长期目标

  • 集成版本控制系统
  • 添加代码质量评分
  • 支持团队协作功能

总结

通过这个项目,我们成功打造了一款功能完整、界面美观的代码统计工具。项目展示了:

  • PyQt5的强大功能 - 从基础组件到高级特性
  • Python的实用性 - 快速原型开发到产品级应用
  • 软件工程思维 - 需求分析、架构设计、用户体验

这不仅仅是一个工具,更是一次完整的软件开发实践。希望这个项目能够为你的开发工作带来便利,也希望能够启发你创造出更多有用的工具。

以上就是Python+PyQt5打造一个代码行数统计工具的详细内容,更多关于Python代码行数统计的资料请关注脚本之家其它相关文章!

相关文章

  • Python实现vlog生成器的示例代码

    Python实现vlog生成器的示例代码

    vlog,全称为Video blog,意为影音博客,也有翻译为微录。本文将尝试用Python基于Moviepy从一个文本文件中自动生成一个视频格式的vlog,感兴趣的可以了解一下
    2023-01-01
  • python中虚拟环境创建的主流方式详细操作指南

    python中虚拟环境创建的主流方式详细操作指南

    这篇文章主要为大家详细介绍了python中虚拟环境创建的主流方式详细操作,并结合适用场景和核心特性进行对比,有需要的小伙伴可以了解下
    2025-07-07
  • Python利用pangu模块实现文本格式化小工具

    Python利用pangu模块实现文本格式化小工具

    其实使用pangu做文本格式标准化的业务代码在之前就实现了,主要能够将中文文本文档中的文字、标点符号等进行标准化。但是为了方便起来我们这里使用了Qt5将其做成了一个可以操作的页面应用,需要的可以了解一下
    2022-10-10
  • Python实现自动记录复制的文本并保存

    Python实现自动记录复制的文本并保存

    这篇文章主要为大家详细介绍了如何使用Python开发一个小工具,可以实现记录你复制的文本内容并自动保存,这样就再也不怕搞丢灵感或者代码段啦
    2025-04-04
  • OpenCV-Python实现轮廓的特征值

    OpenCV-Python实现轮廓的特征值

    轮廓自身的一些属性特征及轮廓所包围对象的特征对于描述图像具有重要意义。本篇博文将介绍几个轮廓自身的属性特征及轮廓包围对象的特征,感兴趣的可以了解一下
    2021-06-06
  • 基于matplotlib中ion()和ioff()的使用详解

    基于matplotlib中ion()和ioff()的使用详解

    这篇文章主要介绍了基于matplotlib中ion()和ioff()的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • python实现断点调试的方法

    python实现断点调试的方法

    本文主要介绍了python实现断点调试的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 用C++封装MySQL的API的教程

    用C++封装MySQL的API的教程

    这篇文章主要介绍了用C++封装MySQL的API的教程,包括对语句拼装器SQLJoin的介绍,需要的朋友可以参考下
    2015-05-05
  • python保存图片的四个常用方法

    python保存图片的四个常用方法

    这篇文章主要给大家介绍了关于python保存图片的四个常用方法,文中分别介绍了PIL的保存图片方法、opencv保存图片、Matplotlib保存图片的方法以及pytorch保存图片,需要的朋友可以参考下
    2022-02-02
  • 用Python Tkinter库GUI编程创建图形用户界面

    用Python Tkinter库GUI编程创建图形用户界面

    这篇文章主要为大家介绍了用Python Tkinter库GUI编程创建图形用户界面,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论