在科研、工程或教育领域,我们经常会遇到大量数学公式需要管理和操作的情况。如何让这些公式清晰地展示、方便地分类、快速地搜索和导出,是一个亟需解决的问题。本篇文章将带你深入了解如何用 Python 打造一款界面友好、功能强大的 智能公式编辑器,同时支持搜索、排序、导出等多种功能,助力公式管理工作更高效。
完整代码已开源,关注微信公众号:贵州安然智行科技有限责任公司
免费获取:dwsd-99
项目简介
这款公式编辑器由 Python + Tkinter 搭配现代化主题库 ttkbootstrap 开发,旨在为用户提供一个全面的公式管理解决方案。以下是它的核心功能:
- 公式管理:支持公式录入、备注添加与编辑、实时预览。
- 会话保存与恢复:支持保存当前公式列表到文件,方便后续加载和继续工作。
- 搜索功能:快速定位公式或备注,精准匹配关键词。
- 智能排序:支持公式或备注的升序/降序排序。
- 多格式导出:公式可导出为 Word、PDF、LaTeX 文件或单独的图片(PNG)。
- 撤销与重做:支持操作的撤销与重做,减少误操作的困扰。
- 拖拽排序:支持直接拖拽调整公式的顺序。
- 自动保存与恢复:定时自动保存当前会话,防止数据丢失,意外关闭后可恢复。
- 自定义主题与字体:浅色、深色主题切换,字体与字号随需调整。
技术栈与实现原理
- Python:作为主开发语言,简洁且功能强大。
- Tkinter + ttkbootstrap:提供现代化 GUI 界面,兼容性强且上手简单。
- Pillow:用于渲染 LaTeX 公式并生成图片。
- Subprocess + Pandoc:实现公式导出为 Word 和 PDF 格式。
- JSON:用于保存和加载会话数据。
功能展示
1. 主界面设计
主界面分为左右两部分:
- 左侧区域:输入公式与备注,支持实时预览。
- 右侧区域:展示公式列表,支持搜索、排序、编辑、删除等操作。
下图展示了主界面布局:
核心功能解析
1. 会话保存与加载
用户可以随时将当前公式会话保存到 JSON 文件中,或从已有文件中加载公式列表。
会话保存代码:
def save_session(self):
if not self.formulas:
messagebox.showwarning("保存会话", "没有公式可保存。")
return
file_path = filedialog.asksaveasfilename(defaultextension=".json",
filetypes=[("JSON 文件", "*.json")])
if file_path:
try:
with open(file_path, 'w', encoding='utf-8') as f:
json.dump(self.formulas, f, ensure_ascii=False, indent=4)
messagebox.showinfo("保存成功", f"会话已保存到 {file_path}")
except Exception as e:
logger.error("保存会话错误", exc_info=True)
messagebox.showerror("保存错误", f"无法保存会话:\n{e}")
会话加载代码:
def load_session(self):
if not self.confirm_discard_changes():
return
file_path = filedialog.askopenfilename(defaultextension=".json",
filetypes=[("JSON 文件", "*.json")])
if file_path:
try:
with open(file_path, 'r', encoding='utf-8') as f:
self.formulas = json.load(f)
self.undo_stack.clear()
self.redo_stack.clear()
self.search_entry.delete(0, tk.END)
self.update_treeview()
messagebox.showinfo("加载成功", f"会话已从 {file_path} 加载")
except Exception as e:
logger.error("加载会话错误", exc_info=True)
messagebox.showerror("加载错误", f"无法加载会话:\n{e}")
2. 搜索功能
支持在公式和备注中快速定位关键词:
def filter_treeview(self, event=None):
search_term = self.search_entry.get().strip().lower()
self.formula_tree.delete(*self.formula_tree.get_children())
for idx, item in enumerate(self.formulas, start=1):
formula_display = self.preprocess_formula(item["formula"])
remark_display = item["remark"] if item["remark"] else ""
if (not search_term) or (search_term in formula_display.lower() or search_term in remark_display.lower()):
self.formula_tree.insert('', tk.END, values=(idx, formula_display, remark_display))
3. 排序功能
支持按公式或备注的升序/降序排序:
def sort_by_formula_asc(self):
old_list = self.formulas[:]
self.formulas.sort(key=lambda x: x["formula"].lower())
new_list = self.formulas[:]
self.undo_stack.append(('sort', old_list, new_list))
self.redo_stack.clear()
self.update_treeview()
messagebox.showinfo("排序完成", "已按【公式(升序)】排序。")
排序功能支持四种模式:公式升序、公式降序、备注升序、备注降序。
4. 导出多种格式
编辑器支持将公式导出为 Word、PDF、LaTeX 文件或单独的 PNG 图片。
- 导出到 Word:通过 Pandoc 实现,支持公式的完整渲染。
def export_to_word(self):
if not self.formulas:
messagebox.showwarning("导出 Word", "没有公式可导出。")
return
pandoc_manager = PandocManager(self.config_manager)
pure_formulas = [item["formula"] for item in self.formulas]
pandoc_manager.convert_to_word(pure_formulas)
导出到 LaTeX 文件:
def export_to_latex(self):
if not self.formulas:
messagebox.showwarning("导出 LaTeX", "没有公式可导出。")
return
file_path = filedialog.asksaveasfilename(defaultextension=".tex", filetypes=[("LaTeX 文件", "*.tex")])
if file_path:
try:
with open(file_path, 'w', encoding='utf-8') as f:
f.write("\\documentclass{article}\n\\usepackage{amsmath}\n\\begin{document}\n")
for item in self.formulas:
formula = item["formula"]
f.write(f"\\[{formula}\\]\n")
f.write("\\end{document}")
messagebox.showinfo("导出成功", f"LaTeX 公式已导出到 {file_path}")
except Exception as e:
logger.error("导出 LaTeX 错误", exc_info=True)
messagebox.showerror("导出错误", f"无法导出 LaTeX 公式:\n{e}")
结与展望
本项目展示了如何用 Python 打造一款集公式管理、搜索、排序、导出于一体的智能工具。无论是研究生撰写论文,还是工程师优化公式管理流程,这款工具都能带来极大便利。
未来可扩展功能:
- 支持公式分组和分类管理。
- 增加云端同步功能,随时随地访问公式列表。
- 提供更丰富的主题和自定义功能。