《Python课程设计——文本编辑器的设计》

《Python课程设计——文本编辑器的设计》

一、问题背景

文本编辑器(或称文字编辑器)是用作编写普通文字的应用软件,它与文档编辑器(或称文字处理器)不同之处在于它并非用作桌面排版(例如文档格式处理),它常用来编写程序的源代码。简介文本编辑器是计算机软件中的一种。主要用于用来编写和查看文本文件。

二、设计内容

1.问题描述

设计一款文本编译器。

2.需求分析

1.编辑保存文本,打开修改文本;

2.常用快捷键,复制,粘贴,全选等;

3.支持撤销功能;

4.支持弹出式菜单等;

可使用tkinter、wxpython、pyqt等实现界面设计。

三、整体设计图

文本编译器
弹出式菜单
复制
粘贴
全选
撤销
更改字号
增大字号
减小字号
设置字号
其他

四、详细设计

文本编译器

import tkinter
import tkinter.filedialog
import tkinter.messagebox
import tkinter.scrolledtext
import tkinter.simpledialog
from tkinter import *
from tkinter.filedialog import *
import tkinter.font as tf
#创建应用程序窗口
app=tkinter.Tk()
app.title("whohowlong牌文本编辑器")
app["width"]=1000
app["height"]=800
textChanged=tkinter.IntVar(value=0)
fontStyle = tf.Font(family="Lucida Grande", size=20)

#当前文件名
filename=''
#创建菜单
menu = tkinter.Menu(app)
#File 子菜单
submenu=tkinter.Menu(menu,tearoff=0)
def Open():
    global filename
    #如果内容以改变,先保存
    if textChanged.get():
        yesno=tkinter.messagebox.askyesno(title="保存是否",message="你想保存吗?")
        if yesno==tkinter.YES:
            Save()
    filename=tkinter.filedialog.askopenfilename(title="打开文件",filetypes=[('Text files','*.txt')])
    if filename:
        #清空内容,位置0.0是lineNumber.Column的表示方法,表示行好和列号
        txtContent.delete(0.0,tkinter.END)
        fp=open(filename,'r')
        txtContent.insert(tkinter.INSERT,''.join(fp.readlines()))
        fp.close()
        #标记为尚未修改
        textChanged.set(0)
    #创建Open菜单并绑定菜单事件处理函数
submenu.add_command(label="打开",command=Open)

def Save():
    global filename
    #如果是第一次保存新建文件,则打开“另存为”窗口
    if not filename:
         SaveAs()
    #如果内容发生改变,保存,可使用with关键字改写文件操作的代码
    elif textChanged.get():
        fp=open(filename,'w')
        fp.write(txtContent.get(0.0,tkinter.END))
        fp.close()
        textChanged.set(0)
submenu.add_command(label='保存',command=Save)

def SaveAs():
    global filename
    #打开“另存为”窗口
    newfilename=tkinter.filedialog.asksaveasfilename(title='另存为',initialdir=r'c:\\',initialfile='new.txt')
    #如果指定了文件名,则保存文件,可使用with改写
    if newfilename:
        fp=open(newfilename,'w')
        fp.write(txtContent.get(0.0,tkinter.END))
        fp.close()
        filename=newfilename
        textChanged.set(0)
submenu.add_command(label='另存为',command=SaveAs)
submenu.add_separator()
def Close():
    global  filename
    Save()
    txtContent.delete(0.0,tkinter.END)
    #置空文件名
    filename=''
submenu.add_command(label="关闭",command=Close)
#将子菜单关联到主菜单上
menu.add_cascade(label='文件',menu=submenu)
#Edit子菜单
submenu=tkinter.Menu(menu,tearoff=0)
#撤销最后一次操作
def Undo():
    txtContent['undo']=True
    try:
        txtContent.edit_undo()
    except Exception as e:
        pass
submenu.add_command(label='撤销',command=Undo)
def Redo():
    txtContent['undo']=True
    try:
        txtContent.edit_redo()
    except Exception as e:
        pass
submenu.add_command(label='恢复',command=Redo)
submenu.add_separator()
def Copy():
    txtContent.clipboard_clear()
    txtContent.clipboard_append(txtContent.selection_get())
submenu.add_command(label='复制',command=Copy)
def Cut():
    Copy()
    #删除所选内容
    txtContent.delete(tkinter.SEL_FIRST,tkinter.SEL_LAST)
submenu.add_command(label='剪切',command=Cut)

def Paste():
    #如果没有选中内容,则直接粘贴到鼠标位置
    #如果有所选内容,则先删除再粘贴
    try:
        txtContent.insert(tkinter.SEL_FIRST,txtContent.clipboard_get())
        txtContent.delete(tkinter.SEL_FIRST,tkinter.SEL_LAST)
        #如果粘贴成功就结束本函数,以免异常处理结构执行完成之后再次粘贴
        return
    except Exception as e:
        pass
    txtContent.insert(tkinter.INSERT,txtContent,clipboard_get())
submenu.add_command(label='粘贴',command=Paste)
submenu.add_separator()

def Search():
    #获取要查找的内容
    textToSearch = tkinter.simpledialog.askstring(title='查找',prompt='您想查找什么呢?')
    start = txtContent.search(textToSearch,0.0,tkinter.END)
    if start:
        tkinter.messagebox.showinfo(title='寻找',message='Ok')
submenu.add_command(label='查找',command=Search)
menu.add_cascade(label='编辑',menu=submenu)


#Help子菜单
submenu = tkinter.Menu(menu,tearoff=0)

#字号功能
menu.add_cascade(label='字号功能',menu=submenu)
labelExample = Label(submenu, text="20", font=fontStyle)
labelExample.pack(side=TOP)
def increase(): #增大字体
    fontsize = fontStyle['size']
    labelExample['text'] = fontsize + 2
    fontStyle.configure(size=fontsize + 2)
submenu.add_command(label='增大字号',command=increase)
def decrease(): #减小字体
    fontsize = fontStyle['size']
    labelExample['text'] = fontsize - 2
    fontStyle.configure(size=fontsize - 2)
submenu.add_command(label='减小字号',command=decrease)

def setfont(): #设置字号
    t = Toplevel(app)
    t.title("字体")
    t.geometry("260x60+200+250")
    t.transient(app)

    def fontset(): #自定义字号
        fontsize = int(e.get())
        labelExample['text'] = fontsize
        fontStyle.configure(size=fontsize)

    Label(t, text="请输入字号:").grid(row=0, column=0, sticky="e")
    e = Entry(t, width=5)
    e.insert(0, str(fontStyle['size']))
    e.grid(row=0, column=1, sticky="e")
    e.focus_set()
    b = Button(t, text="确定",command=fontset)
    b.grid(row=0, column=2, sticky="e")

    def close(): #关闭窗口
        t.destroy()

    t.protocol("关闭", close)
submenu.add_command(label='设置字号', command=setfont)


#Help子菜单
submenu = tkinter.Menu(menu,tearoff=0)
def About():
    tkinter.messagebox.showinfo(title='关于',message='Author:Who howlong')
submenu.add_command(label='关于',command=About)
menu.add_cascade(label='帮助',menu=submenu)
#将创建的菜单关联到应用程序窗口
app.config(menu=menu)

#创建文本编辑组件,并自动适应窗口大小
txtContent = tkinter.scrolledtext.ScrolledText(app,wrap=tkinter.WORD)

def KeyPress(event):
    textChanged.set(1)
txtContent.bind('',KeyPress)
txtContent = Text(app,font = fontStyle ,undo=True)  #文本框
txtContent.pack(expand=YES, fill=BOTH)
app.mainloop()

新增更改字号内容

新增代码

#字号功能
menu.add_cascade(label='字号功能',menu=submenu)
labelExample = Label(submenu, text="20", font=fontStyle)
labelExample.pack(side=TOP)
def increase(): #增大字体
    fontsize = fontStyle['size']
    labelExample['text'] = fontsize + 2
    fontStyle.configure(size=fontsize + 2)
submenu.add_command(label='增大字号',command=increase)
def decrease(): #减小字体
    fontsize = fontStyle['size']
    labelExample['text'] = fontsize - 2
    fontStyle.configure(size=fontsize - 2)
submenu.add_command(label='减小字号',command=decrease)

def setfont(): #设置字号
    t = Toplevel(app)
    t.title("字体")
    t.geometry("260x60+200+250")
    t.transient(app)

    def fontset(): #自定义字号
        fontsize = int(e.get())
        labelExample['text'] = fontsize
        fontStyle.configure(size=fontsize)

    Label(t, text="请输入字号:").grid(row=0, column=0, sticky="e")
    e = Entry(t, width=5)
    e.insert(0, str(fontStyle['size']))
    e.grid(row=0, column=1, sticky="e")
    e.focus_set()
    b = Button(t, text="确定",command=fontset)
    b.grid(row=0, column=2, sticky="e")

    def close(): #关闭窗口
        t.destroy()

    t.protocol("关闭", close)
submenu.add_command(label='设置字号', command=setfont)

五、设计感受

看似小小的文本编译器软件,实际上,实现起来也是有点难的,佩服那些设计大软件的工程师们。
and=fontset)
b.grid(row=0, column=2, sticky=“e”)

def close(): #关闭窗口
    t.destroy()

t.protocol("关闭", close)

submenu.add_command(label=‘设置字号’, command=setfont)


### 运行演示图

[外链图片转存中...(img-e3aLCUP2-1668848750872)]

## 五、设计感受

看似小小的文本编译器软件,实际上,实现起来也是有点难的,佩服那些设计大软件的工程师们。

你可能感兴趣的:(python,开发语言)