Skip to content

Latest commit

 

History

History
221 lines (170 loc) · 11.8 KB

File metadata and controls

221 lines (170 loc) · 11.8 KB

计算器功能开发记录

这个文档用于记录计算器项目的新功能开发过程、设计思路、实现细节、问题与解决方案,便于复盘与后续复用。

当前版本功能概览

已完成

  • 表达式驱动计算:主显示屏展示完整表达式,支持实时预览结果。
  • 安全计算引擎:接入 simpleeval,替代危险的原生 eval()
  • 双显示屏:主屏显示表达式,副屏显示实时预览/错误。
  • 双模式界面:支持标准模式与科学模式切换(Gtk.Revealer 动态展开)。
  • 科学功能(已增强):sincostansqrtloglnabs()pie、幂运算。
  • 角度模式切换(已完成):支持 Deg/Rad 切换,三角函数按当前模式计算。
  • 键盘映射:支持主键盘和小键盘数字、运算符、EnterBackspaceEsc
  • 现代 UI:已升级为深色高质感主题,包含圆角、阴影、层级化配色与交互态反馈。
  • 响应式布局重构(已完成):主界面改为 Gtk.Grid 原生伸缩布局,按钮与面板启用 hexpand/vexpand,键盘区使用 homogeneous 实现等比例自适应。
  • 窗口缩放性能优化(已完成):引入 GLib.timeout_add 防抖(120ms)与断点样式切换,避免在 configure-event 中高频重载样式导致卡顿。
  • 退格按钮修复:标准面板第一行第二个按钮文案改为 <=,并保持退格逻辑。
  • 增加正负号切换 +/-:支持对表达式末尾数字做正负切换。
  • 增加百分号 %(简化版):支持将表达式末尾数字按 /100 转换。
  • 输入合法性保护(基础版):增加输入长度限制、右括号输入校验、连续运算符收敛。
  • 错误提示优化(已完成):细分 Div0语法错误域错误溢出错误
  • 隐式乘法增强(已完成):支持数字与科学函数/常量的自动乘号插入(如 2log(10)3abs(-2))。
  • 历史记录面板(已完成):支持展开/收起历史区,保存最近 12 条表达式与结果。
  • 历史回填(已完成):点击历史项可回填表达式并实时重算预览。
  • 主题系统重构(已完成):支持 Dark/Light 全局主题切换(HC 按钮),通过 .dark-mode/.light-mode 类实现窗口与主容器同步换肤。
  • 按钮语义类映射(已完成):底部输入区统一使用 .btn-number/.btn-operator/.btn-equal,顶部功能区统一使用 .btn-func,主题按钮附加 .btn-theme
  • 顶部功能区可见性修复(已完成):夜间模式下顶部 Sci/Deg/Hist/HC/A-/A+/Touch 与科学函数按钮文本改为高可见前景色,避免“暗底暗字”不可读。
  • 启动体验优化(已完成):默认夜间模式、默认展开科学面板,启动窗口尺寸调整为更贴近演示图的竖版比例。

已知行为说明

  • 当表达式不完整时,预览区保持空白(静默)。
  • 当出现除零时,预览区显示 Div0;其他异常按类型显示对应错误文案。
  • 按下 = 时,仅当预览为有效结果才会写回主表达式;错误状态不会提交。
  • 切换 Deg/Rad 后会立即重算预览结果。
  • 历史仅记录成功提交(按下 = 且预览有效)的计算结果,重复首条会自动去重。
  • 通过 Hist 可展开历史面板;通过 HC 可在 Dark/Light 主题间切换;通过 A-/A+/Touch 可实时调整可读性与触控性。
  • 拖动窗口尺寸时,布局由 GTK 原生网格自动分配,键盘区保持比例化伸缩。
  • 窗口缩放触发样式更新采用防抖策略,仅在断点变化后刷新字号与间距档位。
  • 首次启动默认处于夜间主题并展开科学面板,便于直接使用科学计算功能。

最近变更记录

2026-03-19

UI 修复:主题切换与夜间可读性

问题描述

  • HC 行为是“高对比开关”,无法直观表达“白天/夜间主题切换”。
  • 顶部功能区按钮在夜间模式下存在前景色可见性不足问题。

修复方案(已应用)

  • HC 改为全局主题开关:切换 dark_mode 状态并动态应用 .dark-mode/.light-mode
  • 在 Window 与 root Grid 同步切换主题类,统一驱动所有组件换肤。
  • 顶部功能区采用 .btn-func/.btn-theme,夜间模式强制亮色文字(白色),确保可读性。
  • 底部输入区颜色映射固定:
    • .btn-number:夜间深灰+白字,白天白底+黑字
    • .btn-operator:夜间深灰+蓝字,白天白底+蓝字
    • .btn-equal:两种主题均蓝底白字

启动态优化:尺寸与默认模式

调整内容(已应用)

  • 默认窗口尺寸调整为竖版大窗(640 x 1080),最小尺寸为 360 x 640
  • 默认 dark_mode=True,默认 scientific_mode=True,首次启动直接呈现夜间科学计算布局。

Bug 修复:角度制/弧度制计算不同步

问题描述

  • UI切换到 Rad 模式时,sin(8) 仍返回角度制结果 (0.139173101),而非弧度制结果 (0.989358246)
  • 根本原因:on_toggle_angle_mode() 方法中修改了 use_degrees 状态,但未重新初始化 evaluator,导致三角函数闭包捕获的状态信息过时

修复方案(方案1 - 已应用):

def on_toggle_angle_mode(self, _button: Gtk.Button) -> None:
    self.state.use_degrees = not self.state.use_degrees
    self.evaluator = self._create_evaluator()  # ← 关键修复:重建 evaluator
    self.angle_button.set_label("Deg" if self.state.use_degrees else "Rad")
    self.recompute_preview()
    self.refresh_displays(show_zero_when_empty=False)

修复验证

  • sin(8) 在 Deg 模式:0.139173101(角度制正确值)
  • sin(8) 在 Rad 模式:0.989358246(弧度制正确值)
  • ✅ 复杂表达式:123322*sin(8+2) 等在两种模式下都能正确计算

变更内容

  • 将计算核心从“即时求值状态机”重构为“表达式输入 + 实时解析预览”。
  • 引入 simpleeval 并注册数学函数与常量。
  • 新增标准/科学双模式切换。
  • 完成键盘事件绑定。
  • 修复退格按钮显示异常:将异常符号调整为 <=
  • 强化退格边界行为:表达式为空时不做删除,主屏保持空白,预览同步更新。
  • 新增 +/- 按钮与逻辑:可切换表达式末尾数字正负号。
  • 新增 % 按钮与键盘映射:按简化规则对末尾数字执行百分比转换。
  • 新增输入保护:限制表达式最大长度并校验右括号输入合法性。
  • 新增科学函数按钮:loglnabs,并补充 e 常量按钮。
  • 新增角度制/弧度制切换:支持 Deg/Rad 一键切换,三角函数实时按模式计算。
  • 新增错误分类提示:Div0语法错误域错误溢出错误
  • 统一错误恢复策略:错误预览不允许 = 提交,继续编辑表达式后自动恢复实时预览。
  • 增强隐式乘法规则:数字后输入函数/常量时自动补 *
  • 新增历史记录面板:支持 Hist 开关显示、保存最近 12 条 表达式 = 结果
  • 新增历史回填:点击历史项可回填表达式并立即重算预览。
  • 新增可读性与交互控制:HC 主题切换(Dark/Light)、A-/A+ 字号缩放、Touch 最小触控尺寸切换。
  • 新增主题类驱动机制:通过 .dark-mode/.light-mode 控制全局背景、显示区和按钮配色。
  • 新增语义化按钮样式类:.btn-number/.btn-operator/.btn-equal/.btn-func/.btn-theme
  • 修复顶部功能区夜间文字对比度不足问题,统一提升夜间前景亮度。
  • 调整启动态:默认夜间主题、默认展开科学面板、默认窗口尺寸优化为竖屏展示。
  • UI 架构重构:将主容器改为 Gtk.Grid,统一设置按钮与面板扩展属性,修复窗口缩放留白与比例异常。
  • 样式系统重构:复用单一 Gtk.CssProvider,新增窗口宽度断点(small/medium/large)与 120ms 防抖刷新,降低 resize 开销。
  • 视觉系统重构:重写深色主题(非纯黑白),统一圆角、阴影、内边距,补齐按钮 hover/active 反馈并增强排版层级。

涉及文件

  • MyProject/simplecalculator.py

改进建议(按优先级)

P0(高优先级)

增加正负号切换 +/-(已完成)

价值:负数输入更自然。
实现:已支持对当前表达式末尾数字进行正负切换。

增加百分号 %(已完成简化版)

价值:常见计算器核心功能。
实现:已完成简化版(末段数字 / 100)。
后续:可扩展“与运算符联动”版本。

输入合法性保护(已完成基础版)

价值:提升稳定性。
已实现:限制最大输入长度、右括号合法性校验、连续运算符规则收敛。
后续:可增加更细的括号配对提示与超长输入可视反馈。

P1(中优先级)

结果与错误提示优化(已完成)

价值:用户体验更好。
实现:已细分错误类型(Div0语法错误域错误溢出错误),并统一为“错误态不提交、编辑后自动恢复预览”的策略。

科学函数体验优化(已完成)

价值:提高可用性。
实现:已补充 loglnabs 可视化按钮,并实现 Deg/Rad 角度/弧度切换。

P2(低优先级)

历史记录面板(已完成)

价值:便于回看与复算。
实现:已支持保存最近 12 条表达式与结果,支持点击历史项回填并复算。

主题和可访问性(已完成)

价值:视觉与可读性优化。
实现:已增加主题切换(HC,Dark/Light)、字号偏好(A-/A+)、按钮最小触控尺寸切换(Touch)。

响应式布局与缩放性能(已完成)

价值:窗口缩放时保持界面比例与流畅度。
实现:已完成 Gtk.Grid 自适应布局、键盘区均分伸缩、断点式字号/间距切换与 configure-event 防抖刷新。

打包与发布记录

常用命令

pip install pyinstaller
pyinstaller --onefile --windowed simplecalculator.py

重新打包前清理

Remove-Item build, dist, *.spec -Recurse -Force

2026-03-20

代码规范性优化(已完成)

  • 完成模块级规范增强:增加文件级说明,提升文档化程度与可读性。
  • 完成类型标注优化:
    • 为按钮回调补充明确类型注解,替代宽泛写法。
    • 增加可复用类型别名,减少重复注解。
  • 完成魔法值治理:
    • 提取过渡动画时长常量。
    • 提取文本省略模式常量,统一显示策略。
  • 完成异常处理增强:保留用户友好错误提示,同时补充未知异常日志记录,便于定位问题。
  • 完成 UI 构建重构:将超长界面构建流程拆分为多个小方法(顶部控制区、显示区、历史区、科学区、标准区),提升可维护性。
  • 完成表达式规则常量化:
    • 运算符集合常量化。
    • 不完整表达式尾部规则常量化。
    • 函数前缀规则常量化。

Python 3.10 兼容性处理(已完成)

  • 发现并修复 Python 3.12 专属语法引入问题。
  • 将不兼容的 type alias 语法改为 Python 3.10 可用写法。
  • 针对当前环境 Python 3.10.20 完成兼容确认。

键盘映射回归修复(已完成)

  • 修复主键盘 + / - 无响应问题:
    • 新增按键名 plus、minus 兜底映射。
    • 新增 Shift + equal 映射为 +。
  • 增强跨键盘布局稳定性:新增按键名兜底映射
    • asterisk 映射为 *
    • slash 映射为 /
    • parenleft 映射为 (
    • parenright 映射为 )

验证结果

  • 每轮修改后均执行文件错误检查。
  • simplecalculator.py 当前状态:无错误。
  • 打包状态:已执行 onefile windowed 打包命令并返回成功。