Kimi LeetCode 3547. 图中边值的最大和 C++实现
2026/7/13 0:32:13
在日常开发工作中,我们经常需要快速编辑和预览文本文件,特别是 HTML 和 Markdown 文档。虽然市面上有许多成熟的编辑器,但有时我们需要一个轻量级、定制化的解决方案来满足特定需求。
C:\pythoncode\new\wx_file_editor.py
传统的文本编辑流程存在以下痛点:
基于这些痛点,我决定使用 Python 的 wxPython 库开发一个集成了编辑、保存和预览功能的桌面应用程序。
本项目的核心目标是开发一个功能完善的文件编辑器,具体包括:
os:文件路径操作json:配置文件的读写markdown:Markdown 到 HTML 的转换wx.html2.WebView:HTML 内容的渲染程序采用面向对象的设计模式,主要包含两个类:
FileEditorFrame (主窗口) ├── 界面布局 │ ├── 文件名输入区 │ ├── 路径选择区 │ ├── 内容编辑区 │ └── 操作按钮区 ├── 配置管理 │ ├── 加载保存的路径 │ └── 保存当前路径 └── 核心功能 ├── 文件保存 ├── 内容预览 └── 界面清空 PreviewFrame (预览窗口) ├── WebView 浏览器组件 └── HTML 内容渲染首先,我们创建FileEditorFrame类,继承自wx.Frame:
classFileEditorFrame(wx.Frame):def__init__(self):super().__init__(parent=None,title='文件编辑器与预览器',size=(900,700))# 配置文件路径self.config_file=os.path.join(os.path.expanduser('~'),'.file_editor_config.json')关键点:
.开头表示隐藏文件os.path.expanduser('~')跨平台地获取用户主目录路径界面采用垂直布局(wx.BoxSizer(wx.VERTICAL)),从上到下依次排列各个组件:
name_sizer=wx.BoxSizer(wx.HORIZONTAL)name_label=wx.StaticText(panel,label='文件名称:')self.name_text=wx.TextCtrl(panel,size=(300,-1))self.name_text.SetValue('.html')# 默认显示 .htmlself.name_text.SetHint('例如: myfile.html 或 document.md')设计亮点:
.html,用户只需在前面输入文件名SetHint()提供占位符提示,提升用户体验self.path_text=wx.TextCtrl(panel,size=(300,-1),style=wx.TE_READONLY)saved_path=self.load_saved_path()self.path_text.SetValue(saved_path)browse_btn=wx.Button(panel,label='浏览...')browse_btn.Bind(wx.EVT_BUTTON,self.on_browse)设计要点:
wx.TE_READONLY使路径输入框只读,防止用户手动输入错误路径self.content_text=wx.TextCtrl(panel,style=wx.TE_MULTILINE)font=wx.Font(10,wx.FONTFAMILY_TELETYPE,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_NORMAL)self.content_text.SetFont(font)优化细节:
wx.TE_MULTILINE启用多行文本编辑FONTFAMILY_TELETYPE),适合代码编辑配置管理是提升用户体验的关键功能,避免每次都重新选择路径。
defload_saved_path(self):"""加载保存的路径"""try:ifos.path.exists(self.config_file):withopen(self.config_file,'r',encoding='utf-8')asf:config=json.load(f)returnconfig.get('last_path',os.path.expanduser('~'))exceptException:passreturnos.path.expanduser('~')错误处理策略:
get()方法提供默认值,增强代码健壮性defsave_path(self,path):"""保存当前路径到配置文件"""try:config={'last_path':path}withopen(self.config_file,'w',encoding='utf-8')asf:json.dump(config,f,ensure_ascii=False,indent=2)exceptExceptionase:print(f"保存路径配置失败:{e}")技术细节:
ensure_ascii=False允许保存中文路径indent=2使 JSON 文件格式化,便于手动查看和编辑defon_browse(self,event):"""浏览并选择保存路径"""dlg=wx.DirDialog(self,"选择保存路径",defaultPath=self.path_text.GetValue(),style=wx.DD_DEFAULT_STYLE|wx.DD_DIR_MUST_EXIST)ifdlg.ShowModal()==wx.ID_OK:selected_path=dlg.GetPath()self.path_text.SetValue(selected_path)# 保存路径到配置文件self.save_path(selected_path)dlg.Destroy()交互流程:
样式说明:
wx.DD_DIR_MUST_EXIST确保只能选择已存在的目录defon_save(self,event):"""保存文件"""filename=self.name_text.GetValue().strip()filepath=self.path_text.GetValue().strip()content=self.content_text.GetValue()# 验证输入ifnotfilename:wx.MessageBox('请输入文件名称!','错误',wx.OK|wx.ICON_ERROR)returnifnotfilepath:wx.MessageBox('请选择保存路径!','错误',wx.OK|wx.ICON_ERROR)returnifnotcontent:result=wx.MessageBox('文件内容为空,确定要保存吗?','确认',wx.YES_NO|wx.ICON_QUESTION)ifresult==wx.NO:return# 构建完整路径full_path=os.path.join(filepath,filename)# 保存文件try:withopen(full_path,'w',encoding='utf-8')asf:f.write(content)self.SetStatusText(f'文件已保存:{full_path}')wx.MessageBox(f'文件保存成功!\n路径:{full_path}','成功',wx.OK|wx.ICON_INFORMATION)exceptExceptionase:wx.MessageBox(f'保存失败:{str(e)}','错误',wx.OK|wx.ICON_ERROR)输入验证层次:
用户反馈:
预览功能是本程序的核心特色,支持 HTML 和 Markdown 两种格式。
defon_preview(self,event):"""预览 HTML 或 Markdown 内容"""filename=self.name_text.GetValue().strip().lower()content=self.content_text.GetValue()ifnotcontent:wx.MessageBox('没有内容可以预览!','提示',wx.OK|wx.ICON_WARNING)return# 判断文件类型iffilename.endswith('.html')orfilename.endswith('.htm'):html_content=contenteliffilename.endswith('.md')orfilename.endswith('.markdown'):# 将 Markdown 转换为 HTMLhtml_content=markdown.markdown(content,extensions=['extra','codehilite'])# 添加基本样式html_content=f""" <html> <head> <meta charset="utf-8"> <style> body {{ font-family: Arial, sans-serif; margin: 20px; line-height: 1.6; }} code {{ background-color: #f4f4f4; padding: 2px 5px; border-radius: 3px; }} pre {{ background-color: #f4f4f4; padding: 10px; border-radius: 5px; overflow-x: auto; }} blockquote {{ border-left: 4px solid #ddd; margin: 0; padding-left: 15px; color: #666; }} </style> </head> <body>{html_content}</body> </html> """else:wx.MessageBox('只支持预览 .html, .htm, .md, .markdown 文件!','提示',wx.OK|wx.ICON_WARNING)return# 创建预览窗口preview_frame=PreviewFrame(self,html_content,filename)preview_frame.Show()类型识别逻辑:
lower()转换)Markdown 处理:
markdown.markdown()进行转换extensions=['extra', 'codehilite']启用扩展功能:extra:支持表格、代码块等扩展语法codehilite:代码高亮支持样式设计要点:
classPreviewFrame(wx.Frame):def__init__(self,parent,html_content,filename):super().__init__(parent,title=f'预览:{filename}',size=(800,600))panel=wx.Panel(self)sizer=wx.BoxSizer(wx.VERTICAL)# 使用 WebView 显示 HTMLself.browser=wx.html2.WebView.New(panel)self.browser.SetPage(html_content,"")sizer.Add(self.browser,1,wx.EXPAND|wx.ALL,5)# 关闭按钮close_btn=wx.Button(panel,label='关闭预览')close_btn.Bind(wx.EVT_BUTTON,lambdae:self.Close())sizer.Add(close_btn,0,wx.ALIGN_CENTER|wx.ALL,10)panel.SetSizer(sizer)self.Centre()WebView 组件:
wx.html2.WebView是基于系统原生浏览器引擎的组件SetPage()直接设置 HTML 内容,无需加载外部文件布局特点:
proportion=1)defon_clear(self,event):"""清空所有输入"""result=wx.MessageBox('确定要清空所有内容吗?','确认',wx.YES_NO|wx.ICON_QUESTION)ifresult==wx.YES:self.content_text.SetValue('')self.name_text.SetValue('.html')# 清空后显示 .htmlself.SetStatusText('已清空')用户体验优化:
.html,方便下次输入启动程序后,可以看到简洁清晰的界面:
.htmltest.html(自动补全,只需输入test)<!DOCTYPEhtml><html><body><h1>Hello World!</h1><p>This is a test.</p></body></html>文件已保存: /Users/username/Desktop/test.html输入文件名readme.md
在内容框输入 Markdown 代码:
# 标题 这是一段**粗体**文字和*斜体*文字。 ```python print("Hello World")这是引用内容
点击"预览"按钮
新窗口弹出,显示渲染后的 HTML 效果
代码块、引用、格式化都正确显示
本项目成功实现了一个功能完善的文件编辑器,涉及以