【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()