Skip to content

feat(settings): 添加设置界面和改进窗口逻辑#6

Merged
RICHQAQ merged 4 commits intoRICHQAQ:mainfrom
dongkid:feat/settingsupport
Dec 9, 2025
Merged

feat(settings): 添加设置界面和改进窗口逻辑#6
RICHQAQ merged 4 commits intoRICHQAQ:mainfrom
dongkid:feat/settingsupport

Conversation

@dongkid
Copy link
Copy Markdown
Contributor

@dongkid dongkid commented Dec 8, 2025

feat(settings):
1. 新增设置界面 (SettingsDialog)
* 创建了 pastemd/presentation/settings/dialog.py,实现了一个基于 Tkinter 的多标签页设置窗口。
* 常规设置:支持修改界面语言、文件保存目录、保留临时文件、系统通知、自动打开文件、光标移动等选项。
* 转换设置:支持配置 Pandoc 路径、参考文档 (Reference Docx)、HTML 格式化选项(如删除线转换)、Markdown/HTML 缩进控制、保留原始公式等。
* 高级设置:支持启用 Excel 智能粘贴和格式保留选项。
* 实现了配置的加载、修改和保存逻辑,保存后会实时更新应用状态。
2. 完善 GUI 图标
* 在 SettingsDialog 中添加了图标设置逻辑,使用 assets/icons/logo.ico
* 修改了 pastemd/presentation/hotkey/dialog.py,为热键设置窗口也添加了相同的图标,提升了一致性和专业感。
3. 托盘菜单集成
* 在托盘菜单中添加了“PasteMD 设置”选项。
* 实现了打开设置界面的回调函数,确保在主线程中安全地创建和显示 GUI 窗口,并在打开时暂停热键监听,关闭后恢复监听。
4. 国际化支持
* 在 pastemd/i18n/locales/zh.py 中添加了所有新界面所需的中文翻译。

fix(gui_thread):
问题:修改热键,然后使用新的热键会抛出线程错误。

重构应用程序的 Tkinter 初始化和事件循环管理,解决了 Tcl_AsyncDelete: async handler deleted by the wrong thread 错误。

核心问题在于,Tkinter 控件(如 HotkeyDialogSettingsDialog)正在创建它们自己的 tk.Tk() 根实例,这可能发生在不同的线程中,或与主应用程序的生命周期产生冲突。Tkinter 不是线程安全的,所有 UI 操作都必须在创建了根窗口的主线程上执行。Tcl_AsyncDelete 错误通常发生在 Tcl 解释器被错误的线程销毁时。

  1. 全局 Tk 根窗口管理 (pastemd/core/state.py):

    • AppState 中添加了一个 root 字段,用于持有全局的 tkinter.Tk 实例。这确保了整个应用程序只有一个、一致的根窗口。
  2. 主应用程序循环重构 (pastemd/app/app.py):

    • 在启动时初始化了全局的 tk.Tk() 根窗口并将其隐藏(root.withdraw())。
    • 用 Tkinter 原生的 root.after() 机制替换了用于处理 UI 队列的自定义 while True 循环。这将自定义任务队列的处理直接集成到 Tkinter 的主事件循环(root.mainloop())中,确保所有 UI 任务都在正确的线程上下文中执行。
  3. 对话框实现更新 (pastemd/presentation/hotkey/dialog.py, pastemd/presentation/settings/dialog.py):

    • 修改了两个对话框,使其检查全局的 app_state.root
    • 如果全局根窗口存在,它们现在会创建 tk.Toplevel 窗口(子窗口),而不是新的 tk.Tk 实例。这可以防止创建多个 Tcl 解释器并避免它们之间的冲突。
    • 更新了 show() 方法,对 Toplevel 窗口使用 wait_window(),而不是启动一个嵌套的 mainloop(),从而维持了清晰的事件循环结构。
    • 由于线程安全现在已由架构保证,因此简化了销毁逻辑(_safe_destroy)。

新增设置对话框功能,包含常规、转换和高级三个标签页,支持配置文件保存目录、
Pandoc路径、Excel粘贴选项等。同时增加中文化支持并优化Tkinter窗口管理逻辑,
解决Tcl_AsyncDelete问题,提升UI线程安全性。
Copy link
Copy Markdown
Owner

@RICHQAQ RICHQAQ left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这次新增的设置窗口已经可以承担大部分配置功能,因此我建议在托盘菜单中做进一步精简:

  1. 删除“编辑配置文件”和“重载配置”两个菜单项(已被设置窗口功能覆盖)
  2. 删除“实验性功能”分组(托盘菜单建议保持简洁)

因为这种实验性功能,不常用的设置内容可移到设置窗口中集中管理

这样托盘菜单会更短、更清晰,想问问你的看法

Comment thread pastemd/i18n/locales/zh.py
Comment thread pastemd/presentation/settings/dialog.py Outdated
Comment thread pastemd/presentation/settings/dialog.py Outdated
Copy link
Copy Markdown
Contributor Author

@dongkid dongkid left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

赞同review

@RICHQAQ
Copy link
Copy Markdown
Owner

RICHQAQ commented Dec 9, 2025

你一起改一下然后就提交过来吧,之后我就合并进去了,感谢贡献

新增设置对话框中的“实验性功能”选项卡,将“保留原始数学公式”功能移入该选项卡中。
移除了托盘菜单中的实用性功能子菜单、语言选择菜单以及编辑和重载配置文件的菜单项。
英文设置标题。
Copy link
Copy Markdown
Owner

@RICHQAQ RICHQAQ left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这些可以再改一改吗

"hotkey.runner.title_binding_failed": "Hotkey binding failed",
"hotkey.runner.title_invalid_config": "Hotkey error",
"hotkey.runner.title_serious_error": "Critical error",
"settings.dialog.title": "PasteMD Settings",
Copy link
Copy Markdown
Owner

@RICHQAQ RICHQAQ Dec 9, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

是不是忘记加前面那些设置界面的英文了,可能得补上

@@ -80,6 +80,7 @@ def _create_widgets(self):
self._create_general_tab()
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

常规设置中语言修改,选择后是显示zh,en,感觉这样不太好吧,应该是选择English是显示English,然后在后面确认之后映射过去吧,你觉得呢
image

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

是的,下个提交会改

主要修正了gemini写的gs代码
1.修复设置界面多语言适配
2.修复托盘图标无法退出设置窗口导致窗口孤立的问题
3.修复了对话框阻塞主事件循环的架构缺陷
4.为其他界面提供了可复用的退出监听模式
5.添加了恢复默认路径按钮
6.微调设置界面布局
@dongkid
Copy link
Copy Markdown
Contributor Author

dongkid commented Dec 9, 2025

修改了一下,你看看还有没有我没考虑到的问题

- 添加窗口恢复和聚焦功能,优化设置对话框显示
- 支持清除参考文档路径和恢复默认 Pandoc 路径
- 更新中英文翻译,覆盖新设置项
@RICHQAQ
Copy link
Copy Markdown
Owner

RICHQAQ commented Dec 9, 2025

我自己修改了一些小细节,应该是可以了

@RICHQAQ RICHQAQ changed the title feat(settings): 添加设置界面及多语言支持 feat(settings): 添加设置界面和改进窗口逻辑 Dec 9, 2025
@RICHQAQ RICHQAQ merged commit a792ead into RICHQAQ:main Dec 9, 2025
@RICHQAQ
Copy link
Copy Markdown
Owner

RICHQAQ commented Dec 9, 2025

感谢支持

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants