目的
代码
import tkinter as tk
class APPlication(object):
def __init__(self, master):
self.master = master
self.textpad = None
self.createwidget()
def createwidget(self):
"""创建主菜单栏"""
menubar = tk.Menu(self.master)
"""创建子菜单栏"""
menuFile = tk.Menu(menubar, tearoff=0) # tearoff = False表示取消虚线 ,默认等于 True ,同样可用使用 1 或 0 表示
menuEdit = tk.Menu(menubar, tearoff=False)
menuHelp = tk.Menu(menubar, tearoff=0)
"""在子菜单中添加菜单项"""
for item in ('新建', '打开', '保存', '另存为', '退出'):
if item == '退出':
menuFile.add_separator() # add_separator() 表示添加一条分割线 ,默认不添加
menuFile.add_command(label=item)
else:
menuFile.add_command(label=item)
for item in ('复制', '粘贴', '剪切', '格式化'):
menuEdit.add_command(label=item)
for item in ('查看帮助', '发送反馈', '关于记事本'):
if item == '关于记事本':
menuHelp.add_separator()
menuHelp.add_command(label=item)
else:
menuHelp.add_command(label=item)
"""在主菜单栏添加菜单,并关联子菜单项"""
menubar.add_cascade(label='文件', menu=menuFile)
menubar.add_cascade(label='编辑', menu=menuEdit)
menubar.add_cascade(label='帮助', menu=menuHelp)
"""将主菜单栏放置到跟窗口"""
self.master['menu'] = menubar
"""创建文本编辑区"""
self.textpad = tk.Text(self.master, width=10, height=10)
if __name__ == '__main__':
root = tk.Tk()
root.title('简易记事本')
root.geometry('500x400+400+200')
root.resizable(width=0, height=0)
APP = APPlication(root)
root.mainloop()
结果展示

在原基础上添加右键选项菜单
import tkinter as tk
class APPlication(object):
def __init__(self, master):
self.master = master
self.textpad = None
self.createwidget()
def createwidget(self):
"""创建主菜单栏"""
menubar = tk.Menu(self.master)
"""创建子菜单栏"""
menuFile = tk.Menu(menubar, tearoff=False)
menuEdit = tk.Menu(menubar, tearoff=False)
menuHelp = tk.Menu(menubar, tearoff=False)
"""在子菜单中添加菜单项"""
for item in ('新建', '打开', '保存', '另存为', '退出'):
if item == '退出':
menuFile.add_separator()
menuFile.add_command(label=item)
else:
menuFile.add_command(label=item)
for item in ('复制', '粘贴', '剪切', '格式化'):
menuEdit.add_command(label=item)
for item in ('查看帮助', '发送反馈', '关于记事本'):
if item == '关于记事本':
menuHelp.add_separator()
menuHelp.add_command(label=item)
else:
menuHelp.add_command(label=item)
"""在主菜单栏添加菜单,并关联子菜单项"""
menubar.add_cascade(label='文件', menu=menuFile)
menubar.add_cascade(label='编辑', menu=menuEdit)
menubar.add_cascade(label='帮助', menu=menuHelp)
"""将主菜单栏放置到跟窗口"""
self.master['menu'] = menubar
"""创建文本编辑区"""
self.textpad = tk.Text(self.master, width=10, height=10)
"""添加右键菜单"""
self.textmenu = tk.Menu(self.master, tearoff=False)
for item in ('选择', '取消', '删除', '撤回'):
self.textmenu.add_command(label=item)
"""为右键绑定事件"""
self.master.bind('<3>', self.rightbtn) # <3> 代表鼠标右键 或者使用 <Button-3> 和 <ButtonPress-3>
def rightbtn(self, event):
self.textmenu.post(event.x_root, event.y_root) #x_root 和 y_root 是相对于父容器的坐标 ,post 方法是获取右键单击的坐标
if __name__ == '__main__':
root = tk.Tk()
root.title('简易记事本')
root.geometry('500x400+400+200')
root.resizable(width=0, height=0)
APP = APPlication(root)
root.mainloop()
演示示例

再在以上基础之上,添加键盘快捷键处理
import tkinter as tk
import tkinter.filedialog
class APPlication(object):
def __init__(self, master):
self.master = master
self.textpad = None
self.textmenu = None
self.createwidget()
def createwidget(self):
"""创建主菜单栏"""
menubar = tk.Menu(self.master)
"""创建子菜单栏"""
menuFile = tk.Menu(menubar, tearoff=False)
menuEdit = tk.Menu(menubar, tearoff=False)
menuHelp = tk.Menu(menubar, tearoff=False)
"""在子菜单中添加菜单项"""
for item in ('新建', '打开', '保存', '另存为', '退出'):
if item == '退出':
menuFile.add_separator()
menuFile.add_command(label=item, command=self.Exit)
elif item == '打开':
menuFile.add_command(label=item, command=self.OpenFile, accelerator='CTRL+O')
elif item == '保存':
menuFile.add_command(label=item, command=self.SaveFile, accelerator='CTRL+S')
elif item == '新建':
menuFile.add_command(label=item, command=self.NewFile, accelerator='CTRL+N')
elif item == '另存为':
menuFile.add_command(label=item, accelerator='CTRL+ALT+S')
else:
menuFile.add_command(label=item)
for item in ('复制', '粘贴', '剪切', '格式化'):
menuEdit.add_command(label=item)
for item in ('查看帮助', '发送反馈', '关于记事本'):
if item == '关于记事本':
menuHelp.add_separator()
menuHelp.add_command(label=item)
else:
menuHelp.add_command(label=item)
"""在主菜单栏添加菜单,并关联子菜单项"""
menubar.add_cascade(label='文件', menu=menuFile)
menubar.add_cascade(label='编辑', menu=menuEdit)
menubar.add_cascade(label='帮助', menu=menuHelp)
"""将主菜单栏放置到跟窗口"""
self.master['menu'] = menubar
"""创建文本编辑区"""
self.textpad = tk.Text(self.master, height=30)
self.textpad.pack(pady=2.2)
"""添加右键菜单"""
self.textmenu = tk.Menu(self.master, tearoff=False)
for item in ('打开', '另存为', '背景颜色'):
self.textmenu.add_command(label=item)
"""为右键绑定事件"""
self.master.bind('<ButtonPress-3>', self.rightbtn)
"""增加快捷键的处理"""
self.master.bind('<Control-n>', lambda event: self.NewFile()) # 使用匿名函数绑定处理方法,从而触发快捷键响应
self.master.bind('<Control-s>', lambda event: self.SaveFile())
self.master.bind('<Control-o>', lambda event: self.OpenFile())
"""创建右键事件"""
def rightbtn(self, event):
self.textmenu.post(event.x_root, event.y_root)
def NewFile(self):
self.newfile = tkinter.filedialog.asksaveasfile(title='保存', initialfile='新建文件.txt', defaultextension='.txt',
filetypes=[('文本文件', '*.txt')])
self.SaveFile()
def OpenFile(self):
self.textpad.delete(1.0, 'end') # 清空所有内容
with tkinter.filedialog.askopenfile(title='打开文本文件', filetypes=[('文本文件', '*.txt')]) as openfile:
self.textpad.insert('insert', openfile.read()) # insert 表示从光标所在位置插入字符串
self.filename = openfile.name
def SaveFile(self):
with open(self.filename, 'w') as savefile:
"""end 表示从字符串的最后添加(无论光标在什么位置); 1.0 表示从第1行,第0列开始获取1(行从1开始,列从0开始)"""
textpad_content = self.textpad.get(1.0, 'end')
savefile.write(textpad_content)
def Exit(self):
self.master.quit()
if __name__ == '__main__':
root = tk.Tk()
root.title('简易记事本')
root.geometry('500x400+400+200')
root.resizable(width=0, height=0)
APP = APPlication(root)
root.mainloop()
结果演示
