【Python记事本】之tkinter模块及文件操作

核心代码来源:https://www.cnblogs.com/ybjourney/p/4995678.html

参考教程来源:https://www.cnblogs.com/shwee/p/9427975.html

记事本功能:文件,编辑和关于。
文件包括新建、打开、保存和另存四个命令。
编辑指的是对文本编辑中要使用的模块,下设功能:撤销,重做,复制,剪切,粘贴,查找和全选。
关于是下设作者和版权两栏。


本代码对源代码进行修改并添加了新的功能!
“文本经修改未保存时打开其他文件或新建文件,弹出提示未保存”,高度还原了windows记事本。
核心原理,定义两个全局变量,一个记录文本初次打开时的内容,一个记录是否保存,当点击新建或打开时,判断此时文本内容和初次打开时的文本内容是否经过改动,未改动则可以打开。

效果如下:

代码:不做伸手党,请不要吝啬您的赞!

from tkinter import *
from tkinter import filedialog
import tkinter.messagebox
import os

# 记录未作改动的文本
origintext = ''
# 标记是否保存过
flag = True


def new():
    global filename
    global flag
    global origintext
    if origintext == textpad.get(1.0, END) or flag is True:
        flag = False
        root.title('未命名文件')
        filename = None
        textpad.delete(1.0, END)
        origintext = textpad.get(1.0, END)
    else:
        tkinter.messagebox.showinfo(title='警告', message='文件未保存!')


def openfile():
    global filename
    global origintext
    global flag
    if origintext == textpad.get(1.0, END) or flag is True:
        flag = False
        filename = filedialog.askopenfilename(defaultextension='.txt')
        if filename == '':
            filename = None
        else:
            root.title('FileName:' + os.path.basename(filename))
            textpad.delete(1.0, END)
            f = open(filename, 'r')
            textpad.insert(1.0, f.read())
            f.close()
            origintext = textpad.get(1.0, END)
    else:
        tkinter.messagebox.showinfo(title='警告', message='文件未保存!')


def save():
    global flag
    global filename
    try:
        f = open(filename, 'w')
        msg = textpad.get(1.0, END)
        f.write(msg)
        f.close()
        flag = True
    except:
        saveas()


def saveas():
    f = filedialog.asksaveasfilename(
        initialfile='未命名.txt', defaultextension='.txt')
    global flag
    global filename
    filename = f
    fh = open(f, 'w')
    msg = textpad.get(1.0, END)
    fh.write(msg)
    fh.close()
    flag = True
    root.title('FileName:' + os.path.basename(f))


def undo():
    textpad.event_generate('<<Undo>>')


def redo():
    textpad.event_generate('<<Redo>>')


def copy():
    textpad.event_generate('<<Copy>>')


def cut():
    textpad.event_generate('<<Cut>>')


def paste():
    textpad.event_generate('<<Paste>>')


def search():
    topsearch = Toplevel(root)
    topsearch.geometry('300x30+500+200')
    label1 = Label(topsearch, text='Find')
    label1.grid(row=0, column=0, padx=5)
    entry1 = Entry(topsearch, width=20)
    entry1.grid(row=0, column=1, padx=5)
    button1 = Button(topsearch, text='查找')
    button1.grid(row=0, column=2)


def selectAll():
    textpad.tag_add('sel', '1.0', END)


def author():
    tkinter.messagebox.showinfo(title='作者信息', message='原创 奔奔')


def about():
    tkinter.messagebox.showinfo(title='版权信息', message='版权属于 奔奔')


root = Tk()
root.title('记事本')
# 加号为窗口在屏幕的坐标
root.geometry("400x500+500+100")
menubar = Menu(root)

# 顶部导航
filemenu = Menu(menubar, tearoff=0)
menubar.add_cascade(label='文件', menu=filemenu)
filemenu.add_command(label='新建', command=new)
filemenu.add_command(label='打开', command=openfile)
filemenu.add_command(label='保存', command=save)
filemenu.add_command(label='另存为', command=saveas)

editmenu = Menu(menubar, tearoff=0)
menubar.add_cascade(label='编辑', menu=editmenu)
editmenu.add_command(label='撤销', command=undo)
editmenu.add_command(label='重做', command=redo)
editmenu.add_command(label='复制', command=copy)
editmenu.add_command(label='剪切', command=cut)
editmenu.add_command(label='粘贴', command=paste)
editmenu.add_command(label='查找', command=search)
editmenu.add_command(label='全选', command=selectAll)

aboutmenu = Menu(menubar, tearoff=0)
menubar.add_cascade(label='关于', menu=aboutmenu)
aboutmenu.add_command(label='作者', command=author)
aboutmenu.add_command(label='版权', command=about)

root.config(menu=menubar)

# 功能按钮
toolbar = Frame(root, height=50, bg='yellow')
Button(toolbar, width=10, text='新建', command=new).place(x=10, y=10)
Button(toolbar, width=10, text='打开', command=openfile).place(x=110, y=10)
Button(toolbar, width=10, text='保存', command=save).place(x=210, y=10)
Button(toolbar, width=10, text='撤销', command=undo).place(x=310, y=10)

toolbar.pack(expand=NO, fill=X)

# 底部信息
status = Label(root, text='from 完美主义接班人', bd=1, relief=SUNKEN, anchor='w')
status.pack(side=BOTTOM, fill=X)

# 左侧
lnlabel = Label(root, width=2, bg='antique white')
lnlabel.pack(side=LEFT, fill=Y)

# 编辑区
textpad = Text(root, font=('Arial', 20), undo=True)
textpad.pack(expand=YES, fill=BOTH)

# 滚动条
scroll = Scrollbar(textpad)
textpad.config(yscrollcommand=scroll.set)
scroll.config(command=textpad.yview)
scroll.pack(side=RIGHT, fill=Y)

# 程序入口
root.mainloop()