ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Cursor+Python+PyQt5:用TaoToken统一Key打造电脑监控小工具

Cursor+Python+PyQt5:用TaoToken统一Key打造电脑监控小工具 1. 从“能跑”到“好用”桌面监控小工具的真实痛点用 Cursor 配合 Python PyQt5 写一个电脑监控小工具很多人第一次跑通时都挺兴奋窗口弹出来时间在跳CPU 占用率在动。但真把它挂在桌面角落当常驻工具用问题就来了。我自己踩过的坑是AI 生成的代码里硬件数据读取路径写死了换台机器 CPU 温度直接显示 N/A进程列表刷新太频繁界面卡成幻灯片更麻烦的是后面想加一个“AI 解读当前资源占用”的功能每个脚本都要单独配一套 Key散落在不同文件里改一次要翻半天。这篇就围绕这个场景展开用 Cursor 辅助写 Python PyQt5 桌面监控程序把屏幕截图、进程列表、CPU/内存/GPU 占用做成可视化面板同时用 TaoToken 统一 Key 和 API 通道接入 AI 能力。所谓“统一 Key”就是不管你有多少个脚本、多少个模型调用点都走同一个 API 地址和同一套密钥配置集中在一个config.toml里换模型只改一行。适合已经会用 Python 写点小工具、想让桌面监控更实用、并且打算把 AI 能力接进来的开发者。下面会给出可复制的config.toml配置骨架、PyQt5 界面与监控脚本代码以及运行验证和报错排查步骤。技术部分占大头拿 Key 的部分放在前面快速带过。2. TaoToken 前置统一 Key 与 API 通道怎么准备TaoToken 在这里扮演的角色是“统一入口”。你的监控脚本要调用 AI 做资源解读、异常摘要不需要分别去对接不同厂商的 SDK只需要一个 API 地址和一把 Key。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 根地址是 https://taotoken.net/api 这个地址不加 UTM 参数直接用于代码里。操作路径很直接进控制台创建 API Key然后把它写进本地配置文件。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite API Keys 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。如果你后面要做长期编码或 Agent 类任务可以了解 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。注意Key 只放在本地config.toml不要硬编码进.py文件更不要提交到 Git。监控工具经常要分享给同事配置文件分离能避免泄露。配置骨架长这样放在项目根目录# config.toml [api] base_url https://taotoken.net/api api_key sk-你的Key model claude-sonnet-4-20250514 timeout 30 [monitor] refresh_interval_ms 1500 process_top_n 8 screenshot_enabled true screenshot_dir ./shots [ui] opacity 0.97 always_on_top true font_size 12读取配置用 Python 标准库tomllib3.11或tomliimport tomllib from pathlib import Path def load_config(pathconfig.toml): with open(path, rb) as f: return tomllib.load(f) CFG load_config() API_BASE CFG[api][base_url] API_KEY CFG[api][api_key] MODEL CFG[api][model]这样你的监控脚本、截图脚本、AI 解读脚本都从同一个CFG取配置换模型只改config.toml一行。3. 可复制配置PyQt5 监控面板 截图 进程 AI 解读先装依赖pip install pyqt5 psutil requests pillow tomli主程序分三块硬件数据采集、界面刷新、AI 解读。硬件采集用psutil拿 CPU/内存GPU 部分用pynvmlNVIDIA或降级为 N/A避免像很多 AI 生成代码那样写死 OpenHardwareMonitor 的 8085 端口导致换机就崩。# monitor_core.py import psutil from datetime import datetime def get_system_snapshot(): cpu_percent psutil.cpu_percent(intervalNone) mem psutil.virtual_memory() disk psutil.disk_usage(/) procs [] for p in sorted(psutil.process_iter([pid, name, cpu_percent, memory_percent]), keylambda x: x.info[cpu_percent] or 0, reverseTrue)[:8]: procs.append({ pid: p.info[pid], name: p.info[name], cpu: round(p.info[cpu_percent] or 0, 1), mem: round(p.info[memory_percent] or 0, 1), }) return { time: datetime.now().strftime(%Y-%m-%d %H:%M:%S), cpu: cpu_percent, mem: mem.percent, disk: disk.percent, procs: procs, }GPU 读取单独封装读不到就返回 None界面显示 N/A不要让整个程序崩# gpu_reader.py def get_gpu_info(): try: import pynvml pynvml.nvmlInit() handle pynvml.nvmlDeviceGetHandleByIndex(0) util pynvml.nvmlDeviceGetUtilizationRates(handle) mem pynvml.nvmlDeviceGetMemoryInfo(handle) return { gpu_util: util.gpu, gpu_mem: round(mem.used / mem.total * 100, 1), } except Exception: return {gpu_util: None, gpu_mem: None}截图功能用Pillow的ImageGrab保存到config.toml里配置的目录# screenshot.py import os from PIL import ImageGrab from datetime import datetime def capture_screen(save_dir./shots): os.makedirs(save_dir, exist_okTrue) path os.path.join(save_dir, fshot_{datetime.now():%Y%m%d_%H%M%S}.png) ImageGrab.grab().save(path) return pathAI 解读部分走 TaoToken 的 API用requests发一个 chat completions 请求把当前快照拼成 prompt# ai_advisor.py import requests from config_loader import API_BASE, API_KEY, MODEL def explain_snapshot(snapshot): prompt ( f当前系统快照CPU {snapshot[cpu]}%内存 {snapshot[mem]}% f磁盘 {snapshot[disk]}%。占用最高的进程 .join(f{p[name]}(CPU {p[cpu]}%) for p in snapshot[procs][:5]) 。请用三句话说明是否存在异常并给一条优化建议。 ) resp requests.post( f{API_BASE}/v1/chat/completions, headers{Authorization: fBearer {API_KEY}, Content-Type: application/json}, json{model: MODEL, messages: [{role: user, content: prompt}], max_tokens: 300}, timeout30, ) resp.raise_for_status() return resp.json()[choices][0][message][content]界面部分用 PyQt5 的QTimer定时刷新把上面的数据填进 QLabel 和 QTableWidget。关键点是刷新逻辑放在QThread或加锁避免 AI 请求阻塞 UI# main_window.py from PyQt5.QtWidgets import (QApplication, QWidget, QLabel, QVBoxLayout, QTableWidget, QTableWidgetItem, QPushButton) from PyQt5.QtCore import QTimer from monitor_core import get_system_snapshot from gpu_reader import get_gpu_info from ai_advisor import explain_snapshot class MonitorWindow(QWidget): def __init__(self): super().__init__() self.setWindowTitle(系统监控 AI 解读) self.resize(420, 520) layout QVBoxLayout(self) self.label_time QLabel(--) self.label_cpu QLabel(CPU: --) self.label_mem QLabel(内存: --) self.label_gpu QLabel(GPU: --) self.table QTableWidget(0, 4) self.table.setHorizontalHeaderLabels([PID, 进程, CPU%, 内存%]) self.btn_ai QPushButton(AI 解读当前状态) self.label_ai QLabel(等待解读...) self.label_ai.setWordWrap(True) for w in [self.label_time, self.label_cpu, self.label_mem, self.label_gpu, self.table, self.btn_ai, self.label_ai]: layout.addWidget(w) self.btn_ai.clicked.connect(self.run_ai) self.timer QTimer(self) self.timer.timeout.connect(self.refresh) self.timer.start(1500) self.snapshot {} def refresh(self): self.snapshot get_system_snapshot() gpu get_gpu_info() self.label_time.setText(self.snapshot[time]) self.label_cpu.setText(fCPU: {self.snapshot[cpu]}%) self.label_mem.setText(f内存: {self.snapshot[mem]}%) self.label_gpu.setText(fGPU: {gpu[gpu_util] if gpu[gpu_util] is not None else N/A}%) self.table.setRowCount(len(self.snapshot[procs])) for i, p in enumerate(self.snapshot[procs]): for j, v in enumerate([p[pid], p[name], p[cpu], p[mem]]): self.table.setItem(i, j, QTableWidgetItem(str(v))) def run_ai(self): if not self.snapshot: return try: self.label_ai.setText(explain_snapshot(self.snapshot)) except Exception as e: self.label_ai.setText(fAI 调用失败: {e}) if __name__ __main__: import sys app QApplication(sys.argv) w MonitorWindow() w.show() sys.exit(app.exec_())这套代码和很多 AI 直接生成的版本相比最大的区别是配置外置、GPU 可降级、AI 调用不阻塞界面。Cursor 生成初版后你可以用自然语言让它“把 AI 请求放到 QThread 里”它会帮你改。4. 验证请求跑起来看到什么才算成功先验证 API 通道是否通单独跑一段最小请求import requests from config_loader import API_BASE, API_KEY, MODEL r requests.post( f{API_BASE}/v1/chat/completions, headers{Authorization: fBearer {API_KEY}}, json{model: MODEL, messages: [{role: user, content: 回复 OK}]}, timeout15, ) print(r.status_code, r.json()[choices][0][message][content])预期输出200 OK。如果这里就报 401说明 Key 写错或没带Bearer报 404检查base_url是不是https://taotoken.net/api不要多加/v1之外的路径。再跑主程序python main_window.py成功时你会看到时间每秒跳动CPU/内存/GPU 数值刷新进程表格按 CPU 排序点“AI 解读当前状态”后下方出现一段中文分析。截图功能可以单独测from screenshot import capture_screen print(capture_screen())返回文件路径且./shots下出现 PNG 即成功。想快速对比不同模型对同一快照的解读可以用模型对话页面手动试https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 。5. 本篇常见错排查报错一ModuleNotFoundError: No module named tomllibPython 3.10 及以下没有tomllib。装tomli并改导入try: import tomllib except ModuleNotFoundError: import tomli as tomllib报错二requests.exceptions.ConnectionError或超时先确认网络能访问https://taotoken.net/api再检查config.toml里base_url是否被误写成带/v1/chat/completions的完整路径。代码里只写根地址路径由请求拼接。报错三GPU 一直显示 N/A没有 NVIDIA 显卡或没装pynvml时属正常降级。想显示 AMD/Intel 核显需要额外库建议先保持 N/A不要让程序崩。Cursor 里可以直接问“帮我把 GPU 读取改成可选依赖”它会加 try/except。报错四界面卡顿、点击无响应AI 请求是同步的放在主线程会阻塞。把explain_snapshot放进QThreadfrom PyQt5.QtCore import QThread, pyqtSignal class AIWorker(QThread): done pyqtSignal(str) def __init__(self, snapshot): super().__init__() self.snapshot snapshot def run(self): try: self.done.emit(explain_snapshot(self.snapshot)) except Exception as e: self.done.emit(f失败: {e})报错五401 UnauthorizedKey 失效或复制时带了空格。重新在 API Keys 页面生成https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。接入细节可查文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。报错六截图保存失败ImageGrab在多显示器或权限受限环境可能报错。先确认screenshot_dir有写权限Windows 下避免保存到系统盘根目录。6. 把统一 Key 用在长期编码与 Agent 任务上这套监控工具只是起点。当你开始用 Cursor 写更多脚本、做自动化 Agent 时统一 Key 的价值会更明显所有项目共用一份config.toml换模型、调超时、加备用通道都只改一处。如果你打算把监控数据接到长期运行的编码助手或 Agent 流程里可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。Claude Code 相关接入参考https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 。实际用下来最省事的做法是把config.toml放在用户目录项目里用软链接或环境变量指向它这样多个监控脚本、截图工具、AI 解读模块共享同一套配置不用每开一个新项目就重新配一遍 Key。
返回列表