
一、更新后的 Readme.md(版本升级到 v1.3.0)
markdown
# PC‑InfoTool 硬件信息图形检测工具
**当前版本:v1.3.0**
> 仅支持 Windows 操作系统,无第三方额外UI依赖,开箱即用。
## 📋版本更新日志
### v1.3.0
1. **电池模块重构**:彻底放弃原生WMI `Win32_Battery` 读取容量方案,改为调用系统 `powercfg /batteryreport` 生成电池报告,用纯正则解析HTML提取真实容量数据,解决大量笔记本WMI接口返回DesignCapacity=0的兼容性问题;
2. 正则表达式兼容中英文混排、无冒号、多行换行的电池报告格式,适配中文版Windows系统;
3. 去掉对 `beautifulsoup4`、`ttkthemes` 等所有第三方UI/解析库的依赖,全部用Python标准库实现,打包后体积更小、启动更快;
4. 电池模块增加调试日志:输出powercfg返回码、匹配结果,方便定位读取失败问题;
5. 优化电池健康显示:超过100%自动提示"实测容量高于出厂标称值,属于正常情况"。
### v1.2.1
1. 移除第三方依赖 ttkthemes,全部使用系统自带原生tk/ttk;
2. 日志按日期分目录存放 `logs/YYYY-MM-DD/*.log`;
3. 修复原生Windows不存在 `Win32_Monitor` WMI类导致程序读取崩溃bug,每个硬件模块独立异常捕获。
### v1.1.0
1. 增加日志系统;提供build_exe.bat一键打包脚本;修复WMI读取磁盘分区bug;WMI初始化异常捕获。
### v1.0.0
1. GUI图形界面读取整机、CPU、内存、显卡、磁盘、网卡、显示器硬件;
2. 笔记本电池检测:出厂设计容量、满充容量、电池健康寿命百分比;
3. 每个标签页附带wmic底层命令和字段参数注释;
4. 支持复制单页、复制全部、导出硬件报告为txt。
## ✨功能清单
1. 原生美化GUI图形界面,分类展示全部硬件;
2. 🔋电池健康计算(通过系统powercfg报告读取真实容量,兼容性远高于原生WMI);
3. 每个面板附带底层wmic命令以及字段参数说明,方便用户手动执行验证;
4. 复制单页/复制全部硬件信息;
5. 导出硬件报告为txt文本;
6. 📂日志按日期分文件夹存放 `logs/年-月-日/*.log`,每次运行独立日志文件。
## ⚠️使用注意事项
1. 读取电池真实容量需要**管理员权限**运行脚本/exe,普通权限下powercfg会静默失败;
2. 部分OEM笔记本BIOS屏蔽内存SPD信息,内存字段返回N/A;
3. Intel核显WMI读取显存数值不准,核显显存为内存动态分配;
4. 台式机无电池硬件,电池面板仅显示电池状态。
## 🛠运行依赖
```bash
pip install wmi pywin32 pyinstaller
仅需3个依赖,无额外UI/解析库。
🚀运行
bash
python pc_info_tool.py
📦打包生成exe
双击 build_exe.bat,打包完成后exe输出在 dist/ 文件夹。
🔧电池健康计算公式
电池健康(%) = (FullChargeCapacity ÷ DesignCapacity) ×100%
---
## 二、开发博客:从零写一个类鲁大师的硬件检测小工具,我踩过的那些坑
> 博客标题:**《从零写一个Windows硬件检测工具:从WMI崩溃到电池读数为0的踩坑实录》**
最近想写一个轻量的硬件查看小工具,对标鲁大师:打开就能看到CPU、内存、显卡、磁盘、电池健康这些信息,不用装一堆全家桶。本来以为"不就是调几个WMI命令吗?半小时就能写完",结果前前后后踩了十几个坑,写了快200行bug调试记录才搞定。
### 一、最初的技术选型
最开始的思路非常简单:
1. 用Python自带的tkinter做GUI,不用装额外UI库;
2. 硬件数据全部走Windows原生WMI接口------毕竟 `wmic cpu get name` 这些命令在CMD里直接就能跑,API肯定也一样简单;
3. 电池部分直接读 `Win32_Battery` 类的 `DesignCapacity` 和 `FullChargeCapacity`,健康度一除就出来了。
写出来第一版确实能跑,界面很丑,但功能全了,直到我把代码发给朋友测试------直接报了一堆我本地从来没见过的错误。
---
### 坑1:网上抄的WMI类,Windows根本不存在
朋友电脑跑起来直接抛COM错误:
pywintypes.com_error: 找不到 Win32_Monitor 类
我当时懵了:我在自己电脑上明明能读到显示器信息啊?
查了微软文档才发现:**`Win32_Monitor` 这个类根本不是原生Windows自带的**,是部分OEM厂商或者第三方软件额外注册的WMI扩展,我本地测试的电脑正好装了这类软件,所以能跑,换一台干净的系统直接崩溃。
**解决方案**:换成所有Windows版本都有的 `Win32_MonitorId`,并且给每个硬件读取模块都套上独立的 `try-except`------哪怕显示器读不出来,CPU、内存这些其他硬件也不能跟着崩。
> 教训:网上的WMI示例代码千万别直接抄,很多类名是作者自己机器上特有的。
---
### 坑2:为了UI好看,引入第三方库结果依赖爆炸
第一版原生tkinter界面实在太丑了,灰扑扑的像20年前的软件。我找了个`ttkthemes`主题库,加了一行代码界面瞬间就现代了。
结果打包给用户,直接报错:
ModuleNotFoundError: No module named 'ttkthemes'
我明明在打包前装了依赖啊?后来才知道:
1. pyinstaller打包的时候,第三方主题库的主题文件经常被漏掉;
2. 用户电脑上根本没装这个库,就算打包进去,杀软还可能误报。
**解决方案**:直接把`ttkthemes`全删了,用Windows系统自带的`vista`主题,调调字体、边距、间距,一样能看,零额外依赖,打包体积直接小了10MB。
> 教训:小工具就老老实实用工系统自带的库,别为了一点颜值引入一堆依赖,最后打包出问题。
---
### 坑3:缩进错误和global声明,Python新手和老炮都容易踩
中间改功能的时候反复报两个低级错误:
1. `IndentationError: expected an indented block`------粘贴代码的时候把函数定义下面的代码顶格写了,Python不像JS有自动分号补全,缩进错一行直接整个文件都跑不起来;
2. `SyntaxError: name 'root' is used prior to global declaration`------Python规定函数里只要修改全局变量,`global` 声明必须放在函数**第一行**,放在任何代码后面直接语法报错,根本不会运行。
这种bug查起来最费时间------IDE不会提前提示,跑起来才报错,来回改了三四次才把所有函数的global位置都放对。
---
### 坑4:最离谱的电池模块:WMI说电池容量是0
电池部分是整个工具踩坑最深的地方。我本地测试的时候,读`Win32_Battery`的`DesignCapacity`和`FullChargeCapacity`一切正常,结果到用户电脑上:
DesignCapacity: 0 mWh
FullChargeCapacity: 0 mWh
电池健康: 0%
电池状态:充电中
状态能读出来,容量全是0。
查微软文档才知道:**`Win32_Battery` 这个类的容量字段是可选的,很多笔记本厂商的BIOS根本不把容量数据通过WMI暴露出来**,Windows自己都读不到,Python当然读不到。
本来以为这条路死了,结果突然想到Windows自己有个`powercfg /batteryreport`命令,生成的电池报告里明明白白写着设计容量和满充容量------我直接调用这个命令生成HTML,自己解析不就行了?
---
### 坑5:PowerShell和CMD的语法不兼容
写好代码调用powercfg,结果生成的文件路径完全不对:
报告保存到了 C:\xxx%USERPROFILE%\Desktop\battery-report.html
我当时人傻了,怎么文件夹名变成`%USERPROFILE%`了?
查了半天:我是在PowerShell里测试的,`%USERPROFILE%`是CMD的环境变量语法,**PowerShell根本不识别**,直接当成普通字符串当文件夹名了。PowerShell里正确的写法是`$env:USERPROFILE`。
这个坑浪费了我10分钟找文件------桌面上平白无故多了个名叫`%USERPROFILE%`的奇怪文件夹,点进去才看到报告。
---
### 坑6:正则表达式写对了,为什么匹配不到?
解决了路径问题,程序调用powercfg返回码是0(成功),但是正则就是抓不到数字。
我手动打开报告看,里面的文本是:
DESIGN CAPACITY 设计容量95,989 mWh
我之前写的正则是匹配`DESIGN CAPACITY:`带冒号的------结果中文版Windows报告里**根本没有冒号**,英文和中文直接连在一起,正则当然匹配不到。
改了一版正则,用`.*?`非贪婪匹配中间的所有中文/空格:
```python
re.search(r"DESIGN\s+CAPACITY.*?([\d,]+)\s*mWh", html_text, re.S|re.I)
这次终于成功读到了:设计容量95989mWh,满充100595mWh,健康度104.8%。
教训:写正则解析这种系统生成的报告,一定要先打开实际文件看一眼真实文本格式,别想当然觉得它和英文原版一模一样。
最后:现在这个小工具最终长什么样
折腾了一下午,最终版本是这样的:
- 零额外UI依赖,只用Python自带tkinter,系统原生主题;
- 日志自动按日期分文件夹存放,出问题直接看对应日期的日志;
- 电池部分绕过了WMI的坑,调用系统powercfg读真实容量;
- 每个硬件读取模块独立异常捕获,一个模块读崩了整个程序不会挂;
- 一键打包成exe,双击就能用。
其实这个工具的代码量并不大,核心逻辑也就几百行,但是踩过的坑全是Windows系统兼容性相关的------没有什么复杂的算法,就是不断查文档、试命令、看日志,把各个版本Windows、各个品牌笔记本的兼容坑一个个填上。
如果你也想写类似的系统小工具,最大的感受就是:别相信网上抄来的示例代码,别依赖太多第三方库,自己在不同机器上跑一遍,把所有报错都解决了,才是真正能用的工具。