这个文档用于记录计算器项目的新功能开发过程、设计思路、实现细节、问题与解决方案,便于复盘与后续复用。
- 表达式驱动计算:主显示屏展示完整表达式,支持实时预览结果。
- 安全计算引擎:接入
simpleeval,替代危险的原生eval()。 - 双显示屏:主屏显示表达式,副屏显示实时预览/错误。
- 双模式界面:支持标准模式与科学模式切换(
Gtk.Revealer动态展开)。 - 科学功能(已增强):
sin、cos、tan、sqrt、log、ln、abs、(、)、pi、e、幂运算。 - 角度模式切换(已完成):支持
Deg/Rad切换,三角函数按当前模式计算。 - 键盘映射:支持主键盘和小键盘数字、运算符、
Enter、Backspace、Esc。 - 现代 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 原生网格自动分配,键盘区保持比例化伸缩。
- 窗口缩放触发样式更新采用防抖策略,仅在断点变化后刷新字号与间距档位。
- 首次启动默认处于夜间主题并展开科学面板,便于直接使用科学计算功能。
问题描述:
- 原
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,首次启动直接呈现夜间科学计算布局。
问题描述:
- 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并注册数学函数与常量。 - 新增标准/科学双模式切换。
- 完成键盘事件绑定。
- 修复退格按钮显示异常:将异常符号调整为
<=。 - 强化退格边界行为:表达式为空时不做删除,主屏保持空白,预览同步更新。
- 新增
+/-按钮与逻辑:可切换表达式末尾数字正负号。 - 新增
%按钮与键盘映射:按简化规则对末尾数字执行百分比转换。 - 新增输入保护:限制表达式最大长度并校验右括号输入合法性。
- 新增科学函数按钮:
log、ln、abs,并补充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
价值:负数输入更自然。
实现:已支持对当前表达式末尾数字进行正负切换。
价值:常见计算器核心功能。
实现:已完成简化版(末段数字 / 100)。
后续:可扩展“与运算符联动”版本。
价值:提升稳定性。
已实现:限制最大输入长度、右括号合法性校验、连续运算符规则收敛。
后续:可增加更细的括号配对提示与超长输入可视反馈。
价值:用户体验更好。
实现:已细分错误类型(Div0、语法错误、域错误、溢出、错误),并统一为“错误态不提交、编辑后自动恢复预览”的策略。
价值:提高可用性。
实现:已补充 log、ln、abs 可视化按钮,并实现 Deg/Rad 角度/弧度切换。
价值:便于回看与复算。
实现:已支持保存最近 12 条表达式与结果,支持点击历史项回填并复算。
价值:视觉与可读性优化。
实现:已增加主题切换(HC,Dark/Light)、字号偏好(A-/A+)、按钮最小触控尺寸切换(Touch)。
价值:窗口缩放时保持界面比例与流畅度。
实现:已完成 Gtk.Grid 自适应布局、键盘区均分伸缩、断点式字号/间距切换与 configure-event 防抖刷新。
pip install pyinstaller
pyinstaller --onefile --windowed simplecalculator.pyRemove-Item build, dist, *.spec -Recurse -Force- 完成模块级规范增强:增加文件级说明,提升文档化程度与可读性。
- 完成类型标注优化:
- 为按钮回调补充明确类型注解,替代宽泛写法。
- 增加可复用类型别名,减少重复注解。
- 完成魔法值治理:
- 提取过渡动画时长常量。
- 提取文本省略模式常量,统一显示策略。
- 完成异常处理增强:保留用户友好错误提示,同时补充未知异常日志记录,便于定位问题。
- 完成 UI 构建重构:将超长界面构建流程拆分为多个小方法(顶部控制区、显示区、历史区、科学区、标准区),提升可维护性。
- 完成表达式规则常量化:
- 运算符集合常量化。
- 不完整表达式尾部规则常量化。
- 函数前缀规则常量化。
- 发现并修复 Python 3.12 专属语法引入问题。
- 将不兼容的 type alias 语法改为 Python 3.10 可用写法。
- 针对当前环境 Python 3.10.20 完成兼容确认。
- 修复主键盘 + / - 无响应问题:
- 新增按键名 plus、minus 兜底映射。
- 新增 Shift + equal 映射为 +。
- 增强跨键盘布局稳定性:新增按键名兜底映射
- asterisk 映射为 *
- slash 映射为 /
- parenleft 映射为 (
- parenright 映射为 )
- 每轮修改后均执行文件错误检查。
- simplecalculator.py 当前状态:无错误。
- 打包状态:已执行 onefile windowed 打包命令并返回成功。