尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Python开发Windows系统托盘工具:实时监控AI服务API余额

Python开发Windows系统托盘工具:实时监控AI服务API余额 如果你正在使用 Codex 这类 AI 服务并且是 Windows 用户那么下面这个场景你一定不陌生打开浏览器登录官网在一堆菜单里找到余额查询页面刷新然后关掉。每天重复几次只为确认那串数字还能支撑多久。这个过程不仅繁琐还打断了你的开发或创作流程。更让人头疼的是当你需要快速决策“这个任务用哪个模型更划算”时却没有一个直观、即时的数据参考。这正是我开发这个工具的初衷把 AI 服务的余额查询从一个需要主动访问的“动作”变成一个在桌面上随时可见的“状态”。我做的这个工具可能是目前 Windows 平台上最好看的 Codex 余额显示工具。它不是一个复杂的桌面应用而是一个极简、美观、信息密度高的系统托盘工具。它静静地待在任务栏角落实时显示你的 API 余额让你对资源消耗一目了然从而更专注、更高效地使用 AI 能力。本文将不仅仅是一个工具展示更是一次完整的“从想法到产品”的实战分享。我会详细拆解这个工具解决了什么核心痛点不只是显示余额它的技术架构与设计思路为什么选择这种方案从零开始的完整开发与部署指南包含所有代码和配置你可能遇到的所有坑及其解决方案基于真实踩坑经验如何定制和扩展它适配你自己的 API 或需求无论你是想直接使用这个工具提升效率还是想学习如何将一个简单的想法包装成一个可用的桌面小工具这篇文章都能给你带来直接的帮助。1. 核心痛点我们为什么需要一个独立的余额监控工具在深入代码之前我们先明确问题。对于重度使用 OpenAI Codex、GPT 或类似 API 服务的开发者、创作者来说管理 API 余额存在几个典型的痛点痛点一查询流程中断工作流。你正在用 VS Code 写代码依赖 Copilot背后是 Codex或自己调用 API 进行补全。突然想确认一下用量就必须切出 IDE打开网页登录找到对应页面。这个上下文切换的成本很高。痛点二缺乏实时感知容易“爆预算”。API 调用是即时的但我们的消费感知是滞后的。如果没有低余额预警很可能在一次长时间的调试或批量处理中不知不觉用超额度导致服务突然中断影响线上任务。痛点三多账户管理混乱。很多团队或个人拥有多个 API 密钥例如测试环境、生产环境、不同项目分开。在网页上来回切换账户查看余额非常低效。痛点四数据不直观。官网后台提供的是原始数据如使用量、金额但开发者更关心的是“按当前消耗速度我的余额还能用几天”或者“刚刚那个大模型调用花了多少钱”这种衍生信息需要心算或额外记录。因此一个理想的工具应该具备以下特征无感存在以系统托盘图标形式存在不占用主屏幕空间。实时更新自动、定期从 API 拉取余额信息。信息直观不仅显示余额最好能以进度条、颜色变化等形式展示消耗状态。低开销作为后台工具必须轻量内存和 CPU 占用要极小。易于配置支持多账户、自定义刷新频率等。我开发的这个工具正是围绕这些目标构建的。接下来我们看看它是如何实现的。2. 技术选型与架构设计为什么是 Python Tkinter要实现一个 Windows 系统托盘工具有多种技术方案C# WinForms/WPF、Electron、Qt、甚至 Go 语言配合 GUI 库。我的选择是Python Tkinter原因如下开发效率极高Python 语法简洁库生态丰富。对于这种以功能为核心、UI 相对简单的小工具Python 能最快实现原型。Tkinter 的独特优势零依赖Tkinter 是 Python 的标准 GUI 库无需额外安装任何庞大运行时如 Electron 的 Chromium。系统托盘支持通过pystray库可以完美实现托盘图标、菜单和通知与系统原生体验一致。足够轻量生成的程序内存占用通常在几十 MB 以内远低于 Electron 应用。跨平台潜力虽然本文聚焦 Windows但基于 Tkinter/pystray 的核心代码稍作修改即可在 macOS 和 Linux 上运行。易于打包分发使用PyInstaller可以将 Python 脚本打包成独立的.exe文件用户无需安装 Python 环境即可运行。工具的核心架构非常简单清晰Codex Balance Monitor (CBM) ├── 配置层 (Config) │ ├── 读取 config.ini (API Key, 刷新间隔等) │ └── 管理多账户配置 ├── 数据层 (Fetcher) │ ├── 定时任务调度器 (schedule/threading) │ ├── API 客户端 (requests 库) │ └── 数据解析与缓存 ├── 表示层 (UI) │ ├── 系统托盘图标 (pystray) │ │ ├── 图标状态 (颜色/图案随余额变化) │ │ └── 右键菜单 (退出、设置、查看日志) │ ├── 余额信息显示 (托盘悬停提示) │ └── 通知系统 (低余额预警、更新成功/失败) └── 日志层 (Logger) └── 记录所有操作和错误便于排查整个应用以一个后台守护进程的形式运行主线程维护托盘图标和事件循环另一个线程或定时器负责周期性地获取数据并更新 UI。3. 环境准备与项目初始化在开始编码前你需要准备好开发环境。3.1 基础环境要求操作系统Windows 10 或 Windows 11工具主要针对 Windows但原理通用。Python版本 3.7 及以上。建议使用 3.8 或 3.9兼容性最好。可以从 Python官网 下载安装记得勾选 “Add Python to PATH”。代码编辑器VS Code、PyCharm 或任何你熟悉的编辑器。3.2 创建项目目录在你的工作区创建一个新文件夹例如codex_balance_monitor。mkdir codex_balance_monitor cd codex_balance_monitor3.3 初始化虚拟环境强烈推荐使用虚拟环境可以隔离项目依赖避免污染系统 Python 环境。# 创建虚拟环境 python -m venv venv # 激活虚拟环境 # 在 Windows PowerShell 或 CMD 中 venv\Scripts\activate # 激活后命令行提示符前会出现 (venv) 标识3.4 安装核心依赖库我们将使用以下几个关键库# 在激活的虚拟环境中执行 pip install requests # 用于调用 OpenAI API pip install pystray # 用于创建系统托盘图标 pip install Pillow # pystray 依赖用于处理图标图像 pip install schedule # 用于简单的定时任务调度可选也可用 threading.Timer至此开发环境就准备好了。4. 核心模块拆解与代码实现我们将分模块构建这个工具。所有代码文件都放在项目根目录下。4.1 配置文件管理 (config_manager.py)首先我们需要一个安全、方便的方式来管理 API Key 等敏感信息。我们将使用config.ini文件。; config.ini [OPENAI] ; 你的 OpenAI API Key从 https://platform.openai.com/api-keys 获取 api_key sk-your-actual-api-key-here ; API 请求的基地址如果是通过特定中转服务可能需要修改 api_base https://api.openai.com/v1 ; 查询余额的模型对于 Codex 通常查询 davinci 模型的用量 query_model davinci ; 余额刷新间隔秒建议不低于 3005分钟避免频繁请求 refresh_interval 600 [UI] ; 低余额预警阈值美元当余额低于此值时图标变红或发送通知 low_balance_threshold 5.0 ; 托盘图标主题可选 ‘light‘, ‘dark‘, ‘colorful‘ icon_theme colorful对应的 Python 配置管理类# config_manager.py import os import configparser from pathlib import Path class ConfigManager: def __init__(self, config_pathconfig.ini): self.config_path Path(config_path) self.config configparser.ConfigParser() self._load_config() def _load_config(self): 加载配置文件如果不存在则创建默认配置 if not self.config_path.exists(): self._create_default_config() self.config.read(self.config_path, encodingutf-8) def _create_default_config(self): 创建默认的配置文件 self.config[OPENAI] { api_key: YOUR_API_KEY_HERE, api_base: https://api.openai.com/v1, query_model: davinci, refresh_interval: 600 } self.config[UI] { low_balance_threshold: 5.0, icon_theme: colorful } with open(self.config_path, w, encodingutf-8) as f: self.config.write(f) print(f默认配置文件已创建于: {self.config_path}) print(请编辑此文件填入你的真实 API Key。) def get(self, section, key, fallbackNone): 获取配置项 return self.config.get(section, key, fallbackfallback) def getfloat(self, section, key, fallback0.0): 获取浮点数配置项 return self.config.getfloat(section, key, fallbackfallback) def getint(self, section, key, fallback0): 获取整数配置项 return self.config.getint(section, key, fallbackfallback) # 全局配置实例 config ConfigManager()关键点使用configparser标准库无需额外依赖。首次运行时会自动生成config.ini文件提示用户填写。安全警告务必提醒用户不要将包含真实 API Key 的config.ini文件上传到 GitHub 等公开仓库。应在.gitignore中加入config.ini。4.2 API 余额查询 (balance_fetcher.py)这是工具的核心功能模块负责与 OpenAI API 通信并解析余额信息。# balance_fetcher.py import requests import json import logging from config_manager import config # 设置日志 logging.basicConfig(levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s) logger logging.getLogger(__name__) class BalanceFetcher: def __init__(self): self.api_key config.get(OPENAI, api_key) self.api_base config.get(OPENAI, api_base).rstrip(/) self.headers { Authorization: fBearer {self.api_key}, Content-Type: application/json } # 检查 API Key 是否已配置 if self.api_key YOUR_API_KEY_HERE: raise ValueError(请在 config.ini 文件中配置你的 OpenAI API Key。) def fetch_balance(self): 获取账户余额信息。 返回一个字典包含余额、总额、使用量等关键信息。 如果失败返回 None 并记录错误。 # 注意OpenAI 的余额查询并非直接通过 /dashboard/billing/credit_grants # 官方推荐的方式是查询使用情况然后结合订阅或充值记录计算。 # 这里提供一个更通用的方法查询当前使用量USD和硬性额度限制。 # 对于个人API通常我们更关心“剩余可用额度”。 # 我们将调用 /dashboard/billing/credit_grants 端点如果可用否则回退到使用量估算。 url f{self.api_base}/dashboard/billing/credit_grants try: response requests.get(url, headersself.headers, timeout10) response.raise_for_status() # 如果状态码不是200抛出HTTPError data response.json() # 解析返回的 JSON结构可能随时间变化这里处理常见格式 # 示例响应: {total_granted: 18.0, total_used: 2.34, total_available: 15.66, ...} total_granted data.get(total_granted, 0) total_used data.get(total_used, 0) total_available data.get(total_available, 0) # 如果上述字段不存在尝试其他常见字段 if total_available 0: # 有些端点返回 grants 数组 grants data.get(grants, []) if grants: latest_grant grants[0] total_granted latest_grant.get(amount, 0) total_used latest_grant.get(used_amount, 0) total_available total_granted - total_used balance_info { total_granted: total_granted, total_used: total_used, total_available: total_available, raw_data: data # 保留原始数据供调试 } logger.info(f余额查询成功: 总额 ${total_granted:.2f}, 已用 ${total_used:.2f}, 剩余 ${total_available:.2f}) return balance_info except requests.exceptions.RequestException as e: logger.error(f网络请求失败: {e}) # 网络请求失败尝试备用方案查询使用量需要更复杂的日期处理此处简化 # 可以调用 /usage 端点但需要指定日期范围且返回的是使用量不是直接余额。 # 对于简单显示我们可以只显示“查询失败”或使用缓存的上一次成功数据。 return None except (KeyError, ValueError, json.JSONDecodeError) as e: logger.error(f解析API响应失败: {e}。响应内容: {response.text[:200] if response in locals() else N/A}) return None # 单例模式方便全局调用 fetcher BalanceFetcher()重要说明OpenAI 的余额查询 API 端点可能发生变化。上述代码使用了/dashboard/billing/credit_grants这是常见的端点之一。如果该端点不可用你需要根据 OpenAI 官方文档调整。错误处理非常重要。网络超时、API 变更、Key 失效等情况都必须妥善处理避免程序崩溃。返回的balance_info字典是后续 UI 显示的数据源。4.3 系统托盘界面 (tray_icon.py)这是工具的“门面”负责创建托盘图标、菜单和更新显示信息。# tray_icon.py import threading import time from PIL import Image, ImageDraw, ImageFont import pystray from balance_fetcher import fetcher from config_manager import config import logging logger logging.getLogger(__name__) class TrayIconApp: def __init__(self): self.icon None self.current_balance 0.0 self.low_threshold config.getfloat(UI, low_balance_threshold) self.theme config.get(UI, icon_theme) self._stop_event threading.Event() self._update_thread None def create_image(self, width, height, color1, color2): 动态生成托盘图标图像。可以根据余额状态改变颜色。 # 创建一个新的图像模式为 RGB image Image.new(RGB, (width, height), color1) dc ImageDraw.Draw(image) # 在图标中央画一个圆或矩形用第二种颜色表示“填充”状态 # 这里简单画一个填充矩形其高度与余额比例相关仅作示意更复杂的效果可自行设计 balance_ratio min(self.current_balance / (self.low_threshold * 5), 1.0) if self.low_threshold 0 else 1.0 fill_height int(height * balance_ratio) dc.rectangle([0, height - fill_height, width, height], fillcolor2) return image def get_icon_image(self): 根据余额和主题返回对应的图标图像。 width 64 height 64 # 根据余额状态和主题选择颜色 if self.current_balance self.low_threshold: # 低余额警告红色系 if self.theme dark: return self.create_image(width, height, (80, 20, 20), (255, 50, 50)) else: return self.create_image(width, height, (255, 200, 200), (255, 0, 0)) else: # 余额充足绿色系或主题色 if self.theme dark: return self.create_image(width, height, (30, 60, 30), (50, 255, 100)) elif self.theme light: return self.create_image(width, height, (220, 255, 220), (50, 200, 80)) else: # colorful return self.create_image(width, height, (70, 130, 180), (135, 206, 250)) # 钢蓝色和浅钢蓝 def update_balance_and_icon(self): 获取余额并更新图标和提示文本。 balance_info fetcher.fetch_balance() if balance_info: self.current_balance balance_info.get(total_available, 0.0) # 更新图标 if self.icon: self.icon.icon self.get_icon_image() # 更新悬停提示 (tooltip) tooltip_text fCodex 余额: ${self.current_balance:.2f} if balance_info.get(total_granted): tooltip_text f\n总额: ${balance_info[total_granted]:.2f} if balance_info.get(total_used): tooltip_text f\n已用: ${balance_info[total_used]:.2f} self.icon.title tooltip_text logger.info(fUI已更新余额: ${self.current_balance:.2f}) # 检查低余额预警 if self.current_balance self.low_threshold: self.send_notification(余额不足警告, f当前余额仅剩 ${self.current_balance:.2f}低于阈值 ${self.low_threshold:.2f}。) else: logger.warning(获取余额失败UI未更新。) # 可以设置一个“错误状态”的图标比如灰色问号 if self.icon: self.icon.title 余额查询失败请检查网络和API Key。 def send_notification(self, title, message): 发送系统通知Windows Toast 通知。 # pystray 的 icon 有 notify 方法但依赖系统。这里使用一个简单实现。 if self.icon: try: self.icon.notify(message, title) except Exception as e: logger.error(f发送通知失败: {e}) # 备用方案在日志中记录 logger.warning(f[通知] {title}: {message}) def on_quit(self, icon, item): 退出菜单项的回调函数。 logger.info(正在退出应用...) self._stop_event.set() if self._update_thread and self._update_thread.is_alive(): self._update_thread.join(timeout2) icon.stop() def on_update_now(self, icon, item): 立即更新余额。 logger.info(手动触发余额更新。) self.update_balance_and_icon() def setup_icon(self): 创建托盘图标和菜单。 # 初始图标 menu_items [ pystray.MenuItem(立即更新, self.on_update_now), pystray.MenuItem(退出, self.on_quit) ] self.icon pystray.Icon( codex_balance, iconself.get_icon_image(), menupystray.Menu(*menu_items), title正在初始化... ) # 首次更新 self.update_balance_and_icon() def periodic_update(self): 定时更新余额的线程函数。 refresh_interval config.getint(OPENAI, refresh_interval) while not self._stop_event.is_set(): time.sleep(refresh_interval) if not self._stop_event.is_set(): self.update_balance_and_icon() def run(self): 启动应用。 logger.info(启动 Codex 余额监控工具...) self.setup_icon() # 启动定时更新线程 self._update_thread threading.Thread(targetself.periodic_update, daemonTrue) self._update_thread.start() # 运行图标主循环阻塞 self.icon.run() # 应用入口 if __name__ __main__: app TrayIconApp() app.run()设计亮点动态图标图标颜色和填充比例会根据余额状态变化充足/警告提供视觉提示。丰富提示鼠标悬停在托盘图标上时会显示详细的余额、总额、已用金额。系统通知当余额低于阈值时会弹出 Windows 原生 Toast 通知提醒。线程安全使用独立线程进行定时更新避免阻塞 UI 主循环。4.4 主程序入口 (main.py)这是一个简单的启动脚本负责初始化日志、处理全局异常并启动托盘应用。# main.py import sys import logging import traceback from tray_icon import TrayIconApp def setup_logging(): 配置日志将日志输出到文件和控制台。 log_format %(asctime)s - %(name)s - %(levelname)s - %(message)s logging.basicConfig( levellogging.INFO, formatlog_format, handlers[ logging.FileHandler(codex_balance_monitor.log, encodingutf-8), logging.StreamHandler(sys.stdout) ] ) def main(): setup_logging() logger logging.getLogger(__name__) try: app TrayIconApp() app.run() except Exception as e: logger.error(f应用程序运行出错: {e}) logger.error(traceback.format_exc()) # 这里可以添加一个错误弹窗提示用户查看日志文件 input(程序启动失败请查看日志文件 codex_balance_monitor.log 获取详情。按 Enter 退出...) sys.exit(1) if __name__ __main__: main()5. 运行与效果验证现在我们已经完成了所有核心代码。让我们来运行它。5.1 首次运行配置在项目根目录确保config.ini文件已生成。如果没有运行一次python config_manager.py或直接运行main.py也会生成。用文本编辑器打开config.ini将api_key替换为你自己的 OpenAI API Key。可选调整其他配置如refresh_interval刷新间隔单位秒和low_balance_threshold低余额预警阈值。5.2 启动应用在激活的虚拟环境中运行主程序python main.py如果一切正常你将看到命令行窗口可能会短暂出现然后最小化或隐藏取决于 PyInstaller 打包设置下文会讲。在 Windows 任务栏右侧的系统托盘区域时钟附近会出现一个新的图标。图标颜色会根据你的余额状态显示。将鼠标悬停在图标上会弹出提示框显示你的实时余额。右键点击图标会出现“立即更新”和“退出”菜单。5.3 验证功能自动更新等待设定的刷新间隔默认600秒观察图标提示信息是否自动更新。手动更新右键点击图标选择“立即更新”信息应立即刷新。低余额预警你可以将config.ini中的low_balance_threshold设为一个比当前余额高的值保存后在下次更新或手动更新时应该会收到系统通知并且图标颜色变为警告色红色系。查看日志程序运行的所有信息包括 API 请求和错误都会记录在项目根目录的codex_balance_monitor.log文件中。这是排查问题的关键。6. 打包为独立 EXE 文件我们当然不希望用户为了运行这个小工具而安装 Python 和环境。使用PyInstaller可以将其打包成单个.exe文件。6.1 安装 PyInstallerpip install pyinstaller6.2 创建打包规范文件 (spec文件)虽然可以直接用命令打包但创建一个.spec文件能进行更精细的控制。在项目根目录创建build.spec# build.spec # -*- mode: python ; coding: utf-8 -*- block_cipher None a Analysis( [main.py], # 主入口文件 pathex[], binaries[], datas[], # 如果需要包含 config.ini可以在这里添加但通常让用户自己创建更安全。 hiddenimports[pystray._win32, PIL._tkinter_finder], # pystray 和 Pillow 可能需要的隐藏导入 hookspath[], hooksconfig{}, runtime_hooks[], excludes[], win_no_prefer_redirectsFalse, win_private_assembliesFalse, cipherblock_cipher, noarchiveFalse, ) pyz PYZ(a.pure, a.zipped_data, cipherblock_cipher) exe EXE( pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], nameCodexBalanceMonitor, # 生成的 exe 文件名 debugFalse, bootloader_ignore_signalsFalse, stripFalse, upxTrue, # 使用 UPX 压缩减小体积 upx_exclude[], runtime_tmpdirNone, consoleFalse, # 关键设置为 False 以隐藏控制台窗口 disable_windowed_tracebackFalse, argv_emulationFalse, target_archNone, codesign_identityNone, entitlements_fileNone, iconicon.ico, # 可选指定一个 .ico 文件作为 exe 的图标 )6.3 执行打包命令pyinstaller build.spec打包过程可能需要一两分钟。完成后在项目目录下会生成dist文件夹里面就有CodexBalanceMonitor.exe文件。6.4 分发与使用你可以将dist/CodexBalanceMonitor.exe单独复制到任何 Windows 电脑上运行。首次运行时它会在同一目录下自动生成config.ini文件用户只需编辑该文件填入自己的 API Key 即可。打包注意事项consoleFalse确保了运行时没有黑框控制台窗口符合后台工具的特性。如果希望打包时包含默认的config.ini可以在Analysis的datas参数中添加datas[(config.ini, .)]。但出于安全考虑更推荐让程序自己生成。打包后的.exe文件可能会被 Windows Defender 或某些杀毒软件误报。这是因为 PyInstaller 打包的程序行为可能被识别为可疑。如果遇到此问题可以尝试在打包时关闭 UPX 压缩 (upxFalse)或者对程序进行数字签名成本较高。对于个人使用添加信任即可。7. 常见问题与排查思路在开发和使用过程中你可能会遇到以下问题问题现象可能原因排查方式解决方案运行python main.py后无任何反应托盘图标不出现。1. 虚拟环境未激活或依赖未安装。2.pystray或Pillow安装有问题。3. 代码中存在语法错误或导入错误。1. 确认命令行前有(venv)。2. 运行pip list检查pystray,Pillow,requests是否存在。3. 直接运行python -c “import pystray; import PIL”看是否报错。4. 查看codex_balance_monitor.log文件。1. 重新安装依赖pip install -r requirements.txt如果你创建了该文件。2. 尝试以管理员身份运行命令行或 IDE。托盘图标出现但提示“余额查询失败”或“正在初始化...”。1.config.ini中的api_key未配置或配置错误。2. 网络连接问题无法访问 OpenAI API。3. API 端点已变更。1. 检查config.ini文件内容确保api_key正确且无多余空格。2. 尝试在浏览器中访问https://api.openai.com/v1/dashboard/billing/credit_grants需携带 Bearer Token。3. 查看日志文件中的详细错误信息。1. 填写正确的 API Key。2. 检查系统代理设置。如果使用网络工具可能需要配置requests库的代理。3. 根据 OpenAI 官方文档更新balance_fetcher.py中的 API 端点。余额显示为$0.00但官网后台有余额。1. 使用的 API Key 权限不足无法查询余额。2. 解析 API 响应的逻辑与当前返回的数据结构不匹配。1. 在balance_fetcher.py的fetch_balance方法中打印出response.text查看原始返回数据。2. 对比打印出的 JSON 结构和代码中解析的字段。1. 确保使用的 API Key 拥有查询权限通常所有 API Key 都有。2. 根据实际的 API 响应调整代码中解析total_available等字段的逻辑。打包成 exe 后运行闪退。1. 控制台被隐藏错误信息看不到。2. 缺少运行时依赖或数据文件。3. 路径问题程序找不到config.ini。1. 临时修改build.spec中的consoleTrue重新打包运行 exe 查看错误输出。2. 检查 exe 所在目录是否生成了config.ini。3. 查看是否生成了.log文件。1. 根据控制台错误信息解决。2. 确保程序有在当前目录的写入权限。3. 在代码中使用os.path.dirname(sys.executable)来定位 exe 所在目录并基于此构建配置文件和日志文件的路径。低余额预警通知不弹出。1. Windows 通知设置被关闭。2.pystray的notify方法在某些系统上不支持。1. 检查 Windows 的“通知和操作”设置确保允许应用发送通知。2. 查看日志是否有通知发送失败的错误。1. 开启 Windows 通知。2. 可以实现一个备用通知方案例如使用win10toast库pip install win10toast来发送 Toast 通知作为pystray.notify的补充。8. 进阶优化与最佳实践上面的代码是一个完整可用的版本但如果你想将其用于生产环境或团队共享可以考虑以下优化8.1 安全性增强加密配置文件可以对config.ini中的api_key进行简单的对称加密虽然不能绝对防破解但能增加一点安全性。可以使用cryptography库。环境变量更佳实践是将 API Key 存储在系统环境变量中代码从环境变量读取。修改config_manager.py优先读取环境变量OPENAI_API_KEY。8.2 功能扩展多账户支持修改config.ini结构支持多个[ACCOUNT_1],[ACCOUNT_2]区块。在 UI 上可以通过菜单切换当前显示的账户或者同时显示多个账户的余额摘要。更多 AI 服务支持抽象出BalanceFetcher基类然后为 OpenAI、Azure OpenAI、Anthropic Claude、DeepSeek 等不同服务创建子类。通过配置决定使用哪个 Fetcher。使用量统计图表定期将余额和使用量记录到本地 SQLite 数据库然后集成一个简单的图表库如matplotlib点击托盘菜单可以弹出一个小窗口展示消费趋势图。HTTP 代理支持在config.ini中添加proxy配置项并在balance_fetcher.py的requests.get()中传入proxies参数。8.3 工程化建议创建requirements.txt方便他人复现环境。pip freeze requirements.txt添加单元测试为balance_fetcher.py和config_manager.py编写单元测试模拟 API 响应和配置文件读写。使用日志轮转防止日志文件无限增大。可以使用logging.handlers.RotatingFileHandler。编写安装脚本对于打包后的 exe可以编写一个简单的setup.bat用于创建桌面快捷方式或开机自启动。8.4 开机自启动可选如果希望工具在开机时自动运行可以将打包好的CodexBalanceMonitor.exe的快捷方式放入 Windows 启动文件夹。启动文件夹路径通常为C:\Users\[你的用户名]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup注意开机自启动会增加系统负担请确保你的工具足够轻量。9. 总结通过这个项目我们完成了一个从需求分析、技术选型、编码实现、到打包分发的完整闭环。这个“全网最好看的 Codex 余额显示工具”的核心价值不在于视觉的极致华丽而在于它精准地解决了一个具体场景下的效率痛点——将关键信息从需要主动查询的“动作”变成了被动感知的“状态”。回顾整个开发过程有几个关键决策值得再次强调Python Tkinter/pystray 的组合在开发效率、资源占用和功能实现上取得了很好的平衡特别适合此类小型桌面工具。配置与代码分离的设计使得工具易于分发和他人使用。完善的错误处理和日志记录是保证后台工具稳定运行的生命线。打包成独立 EXE彻底消除了用户的环境依赖是提升工具可用性的关键一步。你可以直接使用这个工具来管理你的 AI 服务余额也可以将其作为一个模板修改其中的 API 调用逻辑和 UI 表现快速开发出监控其他服务如服务器状态、股票价格、天气信息的桌面小工具。所有的完整代码都可以在我的 GitHub 仓库中找到。如果你在使用的过程中有任何问题、建议或者发现了更好的实现方式欢迎一起交流。希望这个工具和这篇文章能帮你节省更多时间更专注于创造本身。
返回列表