代码:(写的有些累了)
#encoding:utf-8
import tkinter
from tkinter import messagebox
from tkinter import filedialog
import os
# 菜单
menuText = {"文件": {"新建": "Ctrl+N", "打开": "Ctrl+O", "保存": "Ctrl+S", "另存为...": "Ctrl+shift+S", "退出": ""},
"编辑": {"撤销": "Ctrl+U", "恢复": "Ctrl+Shift+Z", "查找": "Ctrl+F", "替换": "Ctrl+R", "全选": "Ctrl+A"},
"运行": {"Python3运行": "Ctrl+B", "Python2运行": "Ctrl+Shift+B"}, "帮助": {"快捷键": "Ctrl+H", "关于": ""},
"运行环境修改":{"终端修改": "", }}
# notepad类
class notepad(tkinter.Tk):
def __init__(self, width=0, height=0, adjustX=0, adjustY=0, flag=False):
tkinter.Tk.__init__(self)
if flag:
self.width = width
self.height = height
else:
self.width = self.winfo_screenwidth()
self.height = self.winfo_screenheight()
self.adjustX = adjustX
self.adjustY = adjustY
self.start()
# 屏幕位置确定
def screenCenter(self):
screenHeight = self.winfo_screenheight()
screenWidth = self.winfo_screenwidth()
centerX = (screenWidth - self.width) / 2 - self.adjustX
centerY = (screenHeight - self.height) /2 - self.adjustY
centerPlay = str(self.width) + 'x' + str(self.height) + '+' + str(int(centerX)) + '+' + str(int(centerY))
self.geometry(centerPlay)
# notepad菜单
def notepadMenu(self, textContainer):
menubar = tkinter.Menu(self)
for menuItem in menuText:
menu = tkinter.Menu(menubar, tearoff=0)
for item in menuText[menuItem]:
menu.add_command(label=item, accelerator=menuText[menuItem][item], command=lambda name=item:
self.methodFunc(name, textContainer))
menubar.add_cascade(label=menuItem, menu=menu)
self.config(menu=menubar)
# notepad启动
def start(self):
filename = "notepad"
self.title(filename)
self.screenCenter()
text = tkinter.Text(self, undo=True,)
self.notepadMenu(text)
text.pack(side=tkinter.LEFT, expand=tkinter.YES, fill=tkinter.BOTH)
scroll = tkinter.Scrollbar(self)
scroll.pack(side=tkinter.RIGHT, fill=tkinter.Y)
text.config(yscrollcommand=scroll.set)
scroll.config(command=text.yview)
# 键盘事件绑定
self.bind("<Control-N>", func=lambda event: self.methodFunc("新建", text))
self.bind("<Control-n>", func=lambda event: self.methodFunc("新建", text))
self.bind("<Control-B>", func=lambda event: self.methodFunc("Python3运行", text))
self.bind("<Control-b>", func=lambda event: self.methodFunc("Python3运行", text))
# notepad菜单及命令设置函数
def methodFunc(self, name, text):
if name == "退出":
self.quit()
elif name == "新建":
print(text)
text.delete(0.0, 'end')
self.title("notepad")
elif name == "快捷键":
messagebox.showinfo("快捷键", "新建:Ctrl+n 复制:Ctrl+c\n粘贴:Ctrl+v 运行:Ctrl+b")
elif name == "关于":
messagebox.showinfo("关于", "Author: Oliver\nCopyright: Oliver's Future Company")
elif name == "打开":
result = filedialog.askopenfile('r')
if result != None:
filename = result.name
self.title(filename)
text.delete(0.0, 'end')
text.insert(0.0, result.read())
elif name == "保存":
if self.title() == "notepad":
self.codeSave(text)
else:
filenameFirst = self.title()
print(filenameFirst)
with open(filenameFirst, 'w+') as f:
f.write(text.get(0.0, 'end'))
elif name == "另存为...":
self.codeSave(text)
elif name == "撤销":
text.edit_undo()
elif name == "恢复":
text.edit_redo()
# 可扩展为运行各种计算机编程语言
elif name == "Python3运行" or name == "Python2运行":
self.runCode(name)
# 下面方法省略
def codeSave(self, text):
filenameFirst = filedialog.asksaveasfile(defaultextension='.py')
if None != filenameFirst:
with open(filenameFirst.name, 'w+') as f:
f.write(text.get(0.0, 'end'))
self.title(filenameFirst.name)
def runCode(self, name):
try:
filelist = self.title().split('.')
except:
messagebox.showinfo("运行提示!", "运行错误不是python文件")
else:
if filelist[-1] == 'py':
if "Python3" in name:
# 将deepin-terminal修改为你电脑上的terminal名称,即可运行
os.system("deepin-terminal" + " -e" + " python3 {}".format(self.title()))
else:
os.system("deepin-terminal" + " -e" + " python2 {}".format(self.title()))
else:
messagebox.showinfo("运行提示!", "运行错误不是python文件")
# 运行
if __name__ == '__main__':
# notepad实例化
note = notepad(width=800, height=500, adjustY=50, flag=True).mainloop()
提示:
可扩展为完整的python或其他语言的IDE集成环境。
结果: