基本框架
主菜单
# 采用面向对象的写法
def _creat_menu_bar(self):
menu_bar = Menu(self)
# 文件菜单创建,具体的菜单项可以自行更改
file_menu = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label='文件', menu=file_menu)
file_menu.add_command(label='新建', accelerator='Ctrl+N')
file_menu.add_command(label='打开', accelerator='Ctrl+O')
file_menu.add_command(label='保存', accelerator='Ctrl+S')
file_menu.add_command(label='另存为', accelerator='Shift+Ctrl+S')
file_menu.add_separator()
file_menu.add_command(label='退出', accelerator='Alt+F4')
# 编辑菜单创建
edit_menu = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label='编辑', menu=edit_menu)
edit_menu.add_command(label='撤销', accelerator='Ctrl+Z')
edit_menu.add_command(label='恢复', accelerator='Ctrl+Y')
edit_menu.add_separator()
edit_menu.add_command(label='剪切', accelerator='Ctrl+X')
edit_menu.add_command(label='复制', accelerator='Ctrl+C')
edit_menu.add_command(label='粘贴', accelerator='Ctrl+V')
edit_menu.add_separator()
edit_menu.add_command(label='查找', accelerator='Ctrl+F')
edit_menu.add_separator()
edit_menu.add_command(label='全选', accelerator='Ctrl+A')
# 视图菜单创建
view_menu = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label='视图', menu=view_menu)
self.show_line_number = IntVar()
show_line_number.set(1)
view_menu.add_checkbutton(label='显示行号', variable=show_line_number)
self.highlight_line = IntVar()
view_menu.add_checkbutton(label='高亮当前行',onvalue=1,offvalue=0,variable=highlight_line,command=self._toggle_highlight)
themes_menu = Menu(view_menu,tearoff=0)
view_menu.add_cascade(label='主题',menu=themes_menu)
self.theme_choice = StringVar()
theme_choice.set('Default')
for k in sorted(theme_color):
themes_menu.add_radiobutton(label=k, variable=theme_choice,command=self.change_theme)
# 将创建好的菜单放到主窗口
self['menu'] = menu_bar
快捷菜单
# 利用frame框架去构建快捷菜单
def _creat_shortcut_bar(self):
global shortcut_bar
shortcut_bar = Frame(self, height=25, background='#20b2aa')
shortcut_bar.pack(side='top', fill='x')
for icon in icon_res:
tool_icon = PhotoImage(file=‘文件路径’)
tool_btn = Button(shortcut_bar, image=tool_icon)
# 使用Pwm模块的Balloon方法,在鼠标放在图标上会有提示
balloon = Pmw.Balloon(shortcut_bar)
balloon.bind(tool_btn,icon)
tool_btn.pack(side='left')
self.icon_list.append(tool_icon)
编辑器主题
# 同样通过frame去划定范围
def _creat_body(self):
self.frame1 = Frame(self)
self.frame1.pack(side='left', fill='y')
line_number_bar = Text(frame3, width=4, padx=3, border=0, background='#F0E68C', state='disabled')
line_number_bar.pack(side='left', fill='y')
# 创建文本输入框(undo是否启用撤销机制)
self.frame2 = Frame(self)
self.frame2.pack(side='left', expand=1, fill='both')
content_text = Text(frame1, undo=True)
content_text.pack(side='left', expand=1, fill='both')
self.frame3 = Frame(self)
self.frame3.pack(side='right', fill='y')
scroll_bar = Scrollbar(frame2)
scroll_bar.pack(side='left', fill='y')
content_text['yscrollcommand'] = scroll_bar.set
scroll_bar['command'] = content_text.yview
上下文菜单
具体实现方法和主菜单栏相似,在此不过多赘述
功能实现
# 打开文件,通过使用filedialog进行相应操作
def open_file(self, event=None):
# filetypes参数进行文件类型的过滤
input_file = filedialog.askopenfilename(filetypes=[("文本文档", "*.txt")])
if input_file:
# 使用os获取文件名称
self.title("%s - EditorPlus" % os.path.basename(input_file))
self.file_name = input_file
# 再写入内容之前清空文本域
self.content_text.delete(1.0, END)
# 使用chaedet模块获取文档的编码
with open(input_file, 'rb') as file:
encode=chardet.detect(file.read(1024))['encoding']
with open(input_file, 'r', encoding=encode) as _file:
self.content_text.insert(1.0, _file.read())
self._update_line_num()
# 对文本进行复制,通过事件生成去做相应的操作
def copy(self):
self.content_text.event_generate("<<Copy>>")
# Wm:它主要提供了一些与窗口管理器通信的功能函数,可以使用相应函数在关闭编辑器前做提示
# 上下文菜单的弹出,可以通过post函数进行相应的操作
# 查找方法是通过正则表达式实现的,过程比较繁琐,就不放代码了,text组件自带的有相应的search方法,感兴趣的话,可以去找一找相关文档
遗留问题
一、细节问题不够优化
二、可以增加一个可以对多个文档进行编辑的功能(通过place布局管理器)
效果图