开发者

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

目录
  • 前言
  • 项目背景
  • 技术选型
    • 为什么选择PyQt5
    • 核心技术栈
  • 功能设计
    • 核心功能
  • 完整效果图 
    • 核心代码实现
      • 1. 代码行数统计算法
      • 2. 拖拽功能实现
      • 3. 多线程处理
    • 界面设计亮点
      • 1. 现代化样式
      • 2. 响应式布局
      • 3. 用户体验优化
    • 项目特色
      • 1. 智能识别算法
      • 2. 性能优化
      • 3. 用户友好
    • 使用场景
      • 1. 项目评估
      • 2. 代码审查
      • 3. 团队协作
    • 安装和使用
      • 环境要求
      • 安装步骤
      • 使用方法
    • 技术难点与解决方案
      • 1. 多行字符串识别
      • 2. 编码问题
      • 3. 性能优化
    • 未来规划
      • 短期目标
      • 长期目标
    • 总结

      前言

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

      项目背景

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

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

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

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

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

      技术选型

      为什么选择PyQt5

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

      核心技术栈

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

      功能设计

      核心功能

      1.拖拽支持

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

      2.智能统计

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

      3.批量处理

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

      4.结果展示

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

      5.导出功能

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

      完整效果图 

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

      核心代码实现

      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
          commenlHuBNdt_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 %lHuBNd 2 == 1:
                          in_multiline_string = False
                          multiline_quote = None
                  comment_lines += 1
                  continue
              
              # 检查多行字符串开始
              if '"""' in stripped or "'''" in striandroidpped:
                  # ... 处理逻辑
              
              # 单行注释
              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. 团队协作

      统一代码规范http://www.devze.com

      制定开发计划

      设定质量目标

      安装和使用

      环境要求

      • 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代码行数统计的资料请关注编程客栈(www.devze.com)其它相关文章!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜