tkinter 打造文本编辑器

11 篇文章 0 订阅
2 篇文章 0 订阅

基本框架

主菜单
# 采用面向对象的写法

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布局管理器)

效果图

在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值