Python+PyQt5打造一個(gè)代碼行數(shù)統(tǒng)計(jì)工具
前言
作為一名開發(fā)者,你是否經(jīng)常需要統(tǒng)計(jì)項(xiàng)目中的代碼行數(shù)?是否厭倦了使用命令行工具或者在線工具的繁瑣操作?今天,我將分享如何使用PyQt5開發(fā)一款功能強(qiáng)大、界面美觀的Python代碼行數(shù)統(tǒng)計(jì)工具。
項(xiàng)目背景
在日常開發(fā)中,我們經(jīng)常需要:
- 統(tǒng)計(jì)項(xiàng)目的代碼規(guī)模
- 分析代碼質(zhì)量(代碼行vs注釋行比例)
- 生成項(xiàng)目報(bào)告
- 快速了解項(xiàng)目結(jié)構(gòu)
傳統(tǒng)的解決方案往往存在以下問題:
- 命令行工具操作復(fù)雜
- 在線工具需要上傳代碼(安全隱患)
- 功能單一,缺乏可視化
- 不支持批量處理
因此,我決定開發(fā)一款集成度高、操作簡(jiǎn)便的圖形化工具。
技術(shù)選型
為什么選擇PyQt5
- 跨平臺(tái)支持 - 一次開發(fā),多平臺(tái)運(yùn)行
- 豐富的組件 - 提供完整的GUI組件庫(kù)
- 成熟穩(wěn)定 - 經(jīng)過(guò)多年發(fā)展,穩(wěn)定性極佳
- Python生態(tài) - 與Python完美集成
- 現(xiàn)代化界面 - 支持樣式表,可以打造美觀界面
核心技術(shù)棧
- GUI框架: PyQt5
- 多線程: QThread(避免界面卡頓)
- 文件處理: Python標(biāo)準(zhǔn)庫(kù)
- 正則表達(dá)式: 智能識(shí)別注釋和代碼
功能設(shè)計(jì)
核心功能
1.拖拽支持
- 支持拖拽單個(gè)或多個(gè).py文件
- 支持拖拽目錄(自動(dòng)遞歸掃描)
- 直觀的拖拽區(qū)域設(shè)計(jì)
2.智能統(tǒng)計(jì)
- 準(zhǔn)確識(shí)別代碼行、注釋行、空行
- 支持單行注釋(#)
- 支持多行注釋(“”"或’‘’)
- 正確處理行末注釋
3.批量處理
- 多線程處理,避免界面卡頓
- 實(shí)時(shí)進(jìn)度顯示
- 支持大型項(xiàng)目掃描
4.結(jié)果展示
- 樹形結(jié)構(gòu)顯示文件和目錄
- 詳細(xì)的統(tǒng)計(jì)信息
- 目錄匯總功能
5.導(dǎo)出功能
- 支持導(dǎo)出統(tǒng)計(jì)結(jié)果
- 文本格式,便于分享
完整效果圖

核心代碼實(shí)現(xiàn)
1. 代碼行數(shù)統(tǒng)計(jì)算法
@staticmethod
def count_lines(file_path: str) -> Dict[str, int]:
"""智能統(tǒng)計(jì)代碼行數(shù)"""
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. 拖拽功能實(shí)現(xiàn)
class DropArea(QLabel):
"""支持拖拽的區(qū)域"""
files_dropped = pyqtSignal(list)
def __init__(self):
super().__init__()
self.setAcceptDrops(True)
self.setAlignment(Qt.AlignCenter)
# 設(shè)置樣式和提示文本
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):
"""后臺(tái)統(tǒng)計(jì)線程"""
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)
# 逐個(gè)處理文件
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))
界面設(shè)計(jì)亮點(diǎn)
1. 現(xiàn)代化樣式
使用CSS樣式表打造現(xiàn)代化界面:
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. 響應(yīng)式布局
- 使用QSplitter實(shí)現(xiàn)可調(diào)整的分割布局
- 自適應(yīng)窗口大小
- 合理的組件間距和對(duì)齊
3. 用戶體驗(yàn)優(yōu)化
- 拖拽時(shí)的視覺反饋
- 進(jìn)度條顯示處理進(jìn)度
- 清晰的狀態(tài)提示
- 快捷鍵支持
項(xiàng)目特色
1. 智能識(shí)別算法
相比簡(jiǎn)單的行數(shù)統(tǒng)計(jì),本工具能夠:
- 正確識(shí)別Python的多行字符串
- 區(qū)分文檔字符串和普通注釋
- 處理復(fù)雜的注釋嵌套情況
- 支持不同的引號(hào)格式
2. 性能優(yōu)化
- 多線程處理,避免界面卡頓
- 內(nèi)存優(yōu)化,支持大型項(xiàng)目
- 異常處理,確保程序穩(wěn)定性
- 編碼自動(dòng)檢測(cè),兼容性強(qiáng)
3. 用戶友好
- 直觀的拖拽操作
- 清晰的結(jié)果展示
- 完善的錯(cuò)誤提示
- 詳細(xì)的使用說(shuō)明
使用場(chǎng)景
1. 項(xiàng)目評(píng)估
快速了解項(xiàng)目規(guī)模
分析代碼質(zhì)量
生成項(xiàng)目報(bào)告
2. 代碼審查
檢查注釋覆蓋率
評(píng)估代碼文檔化程度
識(shí)別冗余代碼
3. 團(tuán)隊(duì)協(xié)作
統(tǒng)一代碼規(guī)范
制定開發(fā)計(jì)劃
設(shè)定質(zhì)量目標(biāo)
安裝和使用
環(huán)境要求
- Python 3.6+
- PyQt5
安裝步驟
# 1. 克隆項(xiàng)目 git clone [項(xiàng)目地址] # 2. 安裝依賴 pip install PyQt5 # 3. 運(yùn)行程序 python code_counter.py
使用方法
- 啟動(dòng)程序
- 拖拽文件或目錄到拖拽區(qū)域
- 查看統(tǒng)計(jì)結(jié)果
- 導(dǎo)出報(bào)告(可選)
技術(shù)難點(diǎn)與解決方案
1. 多行字符串識(shí)別
難點(diǎn): Python的多行字符串可能跨越多行,需要正確識(shí)別開始和結(jié)束位置。
解決方案: 使用狀態(tài)機(jī)模式,跟蹤當(dāng)前是否在多行字符串內(nèi)部。
2. 編碼問題
難點(diǎn): Python文件可能使用不同的編碼格式。
解決方案: 優(yōu)先使用UTF-8,失敗時(shí)使用errors='ignore’參數(shù)。
3. 性能優(yōu)化
難點(diǎn): 大型項(xiàng)目包含大量文件,可能導(dǎo)致界面卡頓。
解決方案: 使用QThread進(jìn)行后臺(tái)處理,通過(guò)信號(hào)更新界面。
未來(lái)規(guī)劃
短期目標(biāo)
- 支持更多編程語(yǔ)言
- 添加代碼復(fù)雜度分析
- 支持自定義統(tǒng)計(jì)規(guī)則
長(zhǎng)期目標(biāo)
- 集成版本控制系統(tǒng)
- 添加代碼質(zhì)量評(píng)分
- 支持團(tuán)隊(duì)協(xié)作功能
總結(jié)
通過(guò)這個(gè)項(xiàng)目,我們成功打造了一款功能完整、界面美觀的代碼統(tǒng)計(jì)工具。項(xiàng)目展示了:
- PyQt5的強(qiáng)大功能 - 從基礎(chǔ)組件到高級(jí)特性
- Python的實(shí)用性 - 快速原型開發(fā)到產(chǎn)品級(jí)應(yīng)用
- 軟件工程思維 - 需求分析、架構(gòu)設(shè)計(jì)、用戶體驗(yàn)
這不僅僅是一個(gè)工具,更是一次完整的軟件開發(fā)實(shí)踐。希望這個(gè)項(xiàng)目能夠?yàn)槟愕拈_發(fā)工作帶來(lái)便利,也希望能夠啟發(fā)你創(chuàng)造出更多有用的工具。
以上就是Python+PyQt5打造一個(gè)代碼行數(shù)統(tǒng)計(jì)工具的詳細(xì)內(nèi)容,更多關(guān)于Python代碼行數(shù)統(tǒng)計(jì)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)vlog生成器的示例代碼
vlog,全稱為Video?blog,意為影音博客,也有翻譯為微錄。本文將嘗試用Python基于Moviepy從一個(gè)文本文件中自動(dòng)生成一個(gè)視頻格式的vlog,感興趣的可以了解一下2023-01-01
python中虛擬環(huán)境創(chuàng)建的主流方式詳細(xì)操作指南
這篇文章主要為大家詳細(xì)介紹了python中虛擬環(huán)境創(chuàng)建的主流方式詳細(xì)操作,并結(jié)合適用場(chǎng)景和核心特性進(jìn)行對(duì)比,有需要的小伙伴可以了解下2025-07-07
Python利用pangu模塊實(shí)現(xiàn)文本格式化小工具
其實(shí)使用pangu做文本格式標(biāo)準(zhǔn)化的業(yè)務(wù)代碼在之前就實(shí)現(xiàn)了,主要能夠?qū)⒅形奈谋疚臋n中的文字、標(biāo)點(diǎn)符號(hào)等進(jìn)行標(biāo)準(zhǔn)化。但是為了方便起來(lái)我們這里使用了Qt5將其做成了一個(gè)可以操作的頁(yè)面應(yīng)用,需要的可以了解一下2022-10-10
Python實(shí)現(xiàn)自動(dòng)記錄復(fù)制的文本并保存
這篇文章主要為大家詳細(xì)介紹了如何使用Python開發(fā)一個(gè)小工具,可以實(shí)現(xiàn)記錄你復(fù)制的文本內(nèi)容并自動(dòng)保存,這樣就再也不怕搞丟靈感或者代碼段啦2025-04-04
OpenCV-Python實(shí)現(xiàn)輪廓的特征值
輪廓自身的一些屬性特征及輪廓所包圍對(duì)象的特征對(duì)于描述圖像具有重要意義。本篇博文將介紹幾個(gè)輪廓自身的屬性特征及輪廓包圍對(duì)象的特征,感興趣的可以了解一下2021-06-06
基于matplotlib中ion()和ioff()的使用詳解
這篇文章主要介紹了基于matplotlib中ion()和ioff()的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
python實(shí)現(xiàn)斷點(diǎn)調(diào)試的方法
本文主要介紹了python實(shí)現(xiàn)斷點(diǎn)調(diào)試的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
用Python?Tkinter庫(kù)GUI編程創(chuàng)建圖形用戶界面
這篇文章主要為大家介紹了用Python?Tkinter庫(kù)GUI編程創(chuàng)建圖形用戶界面,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08

