python 写文本编辑器(界面版)

这篇博客介绍了一个使用Python编写的简单文本编辑器,主要功能包括文件的打开和保存、退出、字体设置以及查找和粘贴。文件操作借助于file dialog模块,粘贴功能通过pyperclip模块实现。此外,还详细讲解了如何创建菜单和利用Text widget的search及tag方法来实现文本高亮。
摘要由CSDN通过智能技术生成

在这里插入图片描述
功能较简单,仅实现文件打开保存,退出,以及字体设置,查找粘贴等等。
打开保存文件用到的是file dialog模块,它有四个比较实用的函数:

		filedialog.askopenfilename(***options)
		filedialog.askopenfilenames(**options)
		filedialog.asksaveasfile(**options)
		filedialog.askdirectory(**options)

分别实现文件打开保存,以及获取文件夹路径想进一步了解请参考(简单明了):
https://blog.csdn.net/weixin_44630029/article/details/104399156

粘贴用的是pyperclip模块,模块比较简单实现粘贴复制
pyperclip.copy(‘Hey Hey!’)
pyperclip.paste()
调用就行,详情了解:https://jingyan.baidu.com/article/3aed632ec2522370108091ec.html

里边用到菜单方法先创建实体self.menu = t.Menu(self.root)
最重要的最后要绑定self.root.config(menu=self.menu)
详情了解:https://blog.csdn.net/w15977858408/article/details/104207077?utm_medium=distribute.pc_relevant.none-task-blog-title-6&spm=1001.2101.3001.4242

另外用到了Text 里边的search方法: a = self.entry.search(self.entry_chaozhao.get(), index, ‘end’, exact=True)
以及Text有一个tag方法意义不先定义一个tag,然后在链接self.entry.tag_add(‘search’, a, col) self.entry.tag_config(‘search’,background=‘green’)
格式:
Text.tag_add(“name”,start index,stop index)
然后链接:
Text.tag_config(“name”,操作)
进一步了解详情:https://blog.csdn.net/qq_41556318/article/details/85112829

import tkinter as t
from tkinter import filedialog
import os
import pyperclip

class App:
    def __init__(self):
        self.root = t.Tk()
        self.root.title('文本编辑器')
        self.root['height'] = 500
        self.root['width'] = 800
        self.menu = t.Menu(self.root)
        #文件菜单
        menu1 = t.Menu(self.menu,tearoff= False)     #创建一个菜单实体
        menu1.add_command(label='打开',command=self.optin2)
        menu1.add_command(label='保存',command=self.optin3)
        menu1.add_separator()  #创建一个分割线
        menu1.add_command(label='退出',command=lambda :self.root.destroy())
        self.menu.add_cascade(label='文件', menu=menu1)  #创建父菜单
        #字体设置菜单
        menu2 = t.Menu(self.menu, tearoff=False)
        menu2.add_command(label='字体',command=self.option1)
        self.menu.add_cascade(label='格式',menu = menu2)
        #编辑菜单
        menu3 = t.Menu(self.menu,tearoff=False)
        menu3.add_command(label='查找',command=self.cahzhao)
        menu3.add_command(label='粘贴',command=self.paste)
        self.menu.add_cascade(label='编辑',menu=menu3)

        self.root.config(menu=self.menu)   #用config方法把root窗口和创建好的菜单关联

        s1 = t.Scrollbar(self.root, orient=t.VERTICAL)
        self.entry = t.Text(self.root, setgrid=True,font=('微软雅黑',12),undo = True,
                            yscrollcommand=s1.set)  #设置编辑框
        self.entry.pack()

        self.root.mainloop()


    def option1(self):
        self.ziti_root = t.Tk()
        self.ziti_root.title('字体设置')
        self.ziti_root.geometry('300x200+200+200')

        self.label1 = t.Label(self.ziti_root,text='字体:').pack()
        self.ziti = t.Entry(self.ziti_root,width=8)
        self.ziti.pack()
        self.label2 = t.Label(self.ziti_root,text='大小:').pack()
        self.daxiao = t.Entry(self.ziti_root,width=8)
        self.daxiao.pack()
        self.queding = t.Button(self.ziti_root,text='确定',command=self.ziti_set).pack(pady=2)
        self.ziti.mainloop()

    def optin2(self):
        my_filetypes = [('all files', '.*'), ('text files', '.txt')]   #定义文件打开类型在后边作为变量添加进打开文件的操作中
        answer = filedialog.askopenfilename(parent=self.root,
                                            initialdir=os.getcwd(),
                                            title="Please select a file:",
                                            filetypes=my_filetypes)   #创建打开文件对话框,并赋值。

        self.entry.focus()      #真正执行打开文件操作
        with open(answer,'r+') as fp:
            text = fp.read()
            self.entry.insert('insert',text)

    def optin3(self):
        my_filetypes = [('all files', '.*'), ('text files', '.txt')]  #定义文件打开类型在后边作为变量添加进打开文件的操作中
        answer = filedialog.asksaveasfilename(parent=self.root,
                                            initialdir=os.getcwd(),
                                            title="Please select a file:",
                                            filetypes=my_filetypes)     #创建文件保存对话框,并赋值
        with open(answer+'.txt','w') as fp:
            fp.write(self.entry.get('0.0', 'end'))      #执行文件保存操作

    def ziti_set(self):

        self.entry.tag_add('tag1', '0.0', 'end')
        self.entry.tag_config(tagName='tag1', font=(self.ziti.get(), int(self.daxiao.get())))  # 实现设置字体方法
        self.ziti_root.destroy()
    def cahzhao(self):
        self.chazhao = t.Tk()
        self.chazhao.geometry('500x80+300+300')
        self.chazhao.title('查找')
        label = t.Label(self.chazhao,text='查找内容:')
        label.grid(row=0,column=0)
        self.entry_chaozhao = t.Entry(self.chazhao,width=50)
        self.entry_chaozhao.grid(row=0,column=5)
        self.entry_chaozhao.focus_set()
        button = t.Button(self.chazhao,text='查找',command=self.chazhao_finish)
        button.grid(row=0,column=20)
        button_reset = t.Button(self.chazhao,text='取消',command=self.text_reset)
        button_reset.grid(row=2,column=20)
        self.chazhao.mainloop()


    def chazhao_finish(self):  #定义查找函数并创建新页面
        indexall = []
        index ='1.0'
        end = self.entry.index('end')
        if self.entry_chaozhao.get() != '':
            a = self.entry.search(self.entry_chaozhao.get(), index, 'end', exact=True)
            while a:
                row = a.split('.')
                col = row[0]+'.'+str(int(row[1])+len(self.entry_chaozhao.get()))
                if col not in indexall and float(col) <= float(end):
                    indexall.append(col)
                    self.entry.tag_add('search', a, col)
                    self.entry.tag_config('search',background='green')   #
                    index = row[0]+'.'+str(int(row[1])+len(self.entry_chaozhao.get())+1)
                    a = self.entry.search(self.entry_chaozhao.get(), index, 'end', exact=True)

    def text_reset(self):  #定义恢复默认颜色函数
        indexall = []
        index = '1.0'
        end = self.entry.index('end')
        if self.entry_chaozhao.get() != '':
            a = self.entry.search(self.entry_chaozhao.get(), index, 'end', exact=True)
            while a:
                row = a.split('.')
                col = row[0] + '.' + str(int(row[1]) + len(self.entry_chaozhao.get()))
                if col not in indexall and float(col) <= float(end):
                    indexall.append(col)
                    self.entry.tag_add('search', a, col)
                    self.entry.tag_config('search',background='white')   
                    index = row[0] + '.' + str(int(row[1]) + len(self.entry_chaozhao.get()) + 1)
                    a = self.entry.search(self.entry_chaozhao.get(), index, 'end', exact=True)

    def paste(self):

        self.entry.insert('insert',pyperclip.paste())  #pyperclip模块的方法,想了解的同学可以查一下

if __name__ == '__main__':
    App()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

super_vab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值