?下一篇:
电脑记事本是一种简单的文本编辑器,用于在电脑上创建、编辑和存储文本文件。它通常被用作轻量级的文本编辑工具,适用于简单的文本编辑任务,如写日记、做笔记、编写代码等。以下是对电脑记事本的详细介绍:
总的来说,电脑记事本是一种简单、易用的文本编辑工具,适用于基本的文本编辑任务。虽然它的功能相对有限,但对于简单的任务来说已经足够。如果你需要更高级的文本编辑功能,可以考虑使用更专业的文本编辑器或写作软件。
这个项目之前做过一版,可读性欠缺火候,对此我将重新梳理代码,分阶段在博客分享。
本文章可以说是大部分还原了记事本的UI以及菜单(包括鼠标右键菜单)。
在第一篇只完成记事本UI设计,并没有绑定触发条件,所以无具体功能实现。
倘若有疑问或建议请在评论区畅所欲言!
首先新建一个项目文件夹,并且命名为"记事本项目",然后在其目录下再新建三个文件夹,分别为"code"(用于存放代码)、"data"(用于存放数据)、"photo"(用于存放图片)。
"""
记事本底座
"""
# 通配符 "*"
__all__ = ['Notepad_base']
# 导入内置模块
import tkinter as tk
class Notepad_base(tk.Tk):
""" 继承tk.Tk, 创建记事本底座UI """
def __init__(self):
""" 重写父类的构造方法 """
# 调用父类的构造方法
super().__init__()
""" 开始对记事本底座UI进行设计 """
self.title('无标题 - 记事本') # 窗口标题
self.geometry(f'750x550+{self.winfo_screenwidth() // 4}+{self.winfo_screenheight() // 8}')
# 创建一级菜单栏(此时为空)
self.menubar = tk.Menu(self)
self.config(menu=self.menubar) # 启用
""" 文件菜单 """
# 创建二级菜单栏(此时为空)
self.fileMenu = tk.Menu(self.menubar, tearoff=0)
# 向一级菜单栏添加 文件 项,并与二级菜单(fileMenu)建立级联关系(从属/上下级)
self.menubar.add_cascade(label='文件(F)', menu=self.fileMenu)
# 文件的二级菜单栏添加 ... 项
self.fileMenu.add_command(label=f'新建(N){" " * 28}Ctrl+N')
self.fileMenu.add_command(label=f'新窗口(W){" " * 16}Ctrl+Shift+N')
self.fileMenu.add_command(label=f'打开(O)...{" " * 26}Ctrl+O')
self.fileMenu.add_command(label=f'保存(S){" " * 29}Ctrl+S')
self.fileMenu.add_command(label=f'另存为(A)...{" " * 15}Ctrl+Shift+S')
self.fileMenu.add_command(label=f'页面设置(U)...')
self.fileMenu.add_command(label=f'打印(P)...{" " * 27}Ctrl+P')
self.fileMenu.add_command(label=f'退出(X)')
# 菜单之间插入分隔线
self.fileMenu.insert_separator(5)
self.fileMenu.insert_separator(8)
""" 编辑菜单 """
# 创建二级菜单栏(此时为空)
self.editMenu = tk.Menu(self.menubar, tearoff=0)
# 向一级菜单栏添加 编辑 项,并与二级菜单(editMenu)建立级联关系(从属/上下级)
self.menubar.add_cascade(label='编辑(E)', menu=self.editMenu)
# 编辑的二级菜单栏添加 ... 项
self.editMenu.add_command(label=f'撤销(U){" " * 26}Ctrl+Z')
self.editMenu.add_command(label=f'剪切(T){" " * 26}Ctrl+X')
self.editMenu.add_command(label=f'复制(C){" " * 26}Ctrl+C')
self.editMenu.add_command(label=f'粘贴(V){" " * 26}Ctrl+V')
self.editMenu.add_command(label=f'删除(L){" " * 27}Delete')
self.editMenu.add_command(label=f'使用 Bing 搜索...{" " * 14}Ctrl+E')
self.editMenu.add_command(label=f'查找(F)...{" " * 25}Ctrl+F')
self.editMenu.add_command(label=f'查找上一个(N){" " * 23}F3')
self.editMenu.add_command(label=f'查找下一个(V){" " * 15}Shift+F3')
self.editMenu.add_command(label=f'替换(R)...{" " * 23}Ctrl+H')
self.editMenu.add_command(label=f'转到(G)...{" " * 23}Ctrl+G')
self.editMenu.add_command(label=f'全选(A){" " * 26}Ctrl+A')
self.editMenu.add_command(label=f'时间/日期(D){" " * 25}F5')
# 菜单之间插入分隔线
self.editMenu.insert_separator(1)
self.editMenu.insert_separator(6)
self.editMenu.insert_separator(13)
""" 格式菜单 """
# 全局变量
self.word_wrap = tk.BooleanVar(value=True) # 是否选择勾上
# 创建二级菜单栏(此时为空)
self.formatMenu = tk.Menu(self.menubar, tearoff=0)
# 向一级菜单栏添加 格式 项,并与二级菜单(formatMenu)建立级联关系(从属/上下级)
self.menubar.add_cascade(label='格式(O)', menu=self.formatMenu)
# 格式的二级菜单栏添加 ... 项
self.formatMenu.add_checkbutton(label='自动换行(W)', variable=self.word_wrap, onvalue=1, offvalue=0)
self.formatMenu.add_command(label='字体(F)...')
""" 查看菜单 """
# 全局变量
self.state = tk.BooleanVar(value=True)
# 创建二级菜单栏(此时为空)
self.viewMenu = tk.Menu(self.menubar, tearoff=0)
# 向一级菜单栏添加 查看 项,并与二级菜单(checkMenu)建立级联关系(从属/上下级)
self.menubar.add_cascade(label='查看(V)', menu=self.viewMenu)
# 创建三级菜单栏(此时为空)
self.threeViewMenu = tk.Menu(self.viewMenu, tearoff=0)
# 查看的二级菜单栏添加 ... 项
self.viewMenu.add_cascade(label='缩放(Z)', menu=self.threeViewMenu)
self.viewMenu.add_checkbutton(label='状态栏(S)', variable=self.state, onvalue=1, offvalue=0)
# 缩放的三级菜单栏添加 ... 项
self.threeViewMenu.add_command(label=f'放大(I){" " * 14}Ctrl + 加号')
self.threeViewMenu.add_command(label=f'缩小(O){" " * 13}Ctrl + 减号')
self.threeViewMenu.add_command(label=f'恢复默认缩放{" " * 11}Ctrl+0')
""" 帮助菜单 """
# 创建二级菜单栏(此时为空)
self.helpMenu = tk.Menu(self.menubar, tearoff=0)
# 向一级菜单栏添加 帮助 项,并与二级菜单(helpMenu)建立级联关系(从属/上下级)
self.menubar.add_cascade(label='帮助(H)', menu=self.helpMenu)
# 帮助的二级菜单栏添加 ... 项
self.helpMenu.add_command(label='查看帮助(H)')
self.helpMenu.add_command(label='发送反馈(F)')
self.helpMenu.add_command(label='关于文本编辑器(A)')
# 菜单之间插入分隔线
self.helpMenu.insert_separator(2)
""" 右键菜单 """
# 创建二级菜单栏(此时为空)
self.rightKeyMenu = tk.Menu(self, tearoff=0)
# 创建三级菜单栏(此时为空)
self.threeRightMenu = tk.Menu(self.rightKeyMenu, tearoff=0)
# 右键菜单的二级菜单栏添加 ... 项
self.rightKeyMenu.add_command(label='撤销(U)')
self.rightKeyMenu.add_command(label='剪切(T)')
self.rightKeyMenu.add_command(label='复制(C)')
self.rightKeyMenu.add_command(label='粘贴(P)')
self.rightKeyMenu.add_command(label='删除(D)')
self.rightKeyMenu.add_command(label='全选(A)')
self.rightKeyMenu.add_checkbutton(label='从右到左的阅读顺序(R)')
self.rightKeyMenu.add_checkbutton(label='显示 Unicode 控制字符(S)')
self.rightKeyMenu.add_cascade(label='插入 Unicode 控制字符(I)', menu=self.threeRightMenu)
self.rightKeyMenu.add_command(label='关闭输入法(L)')
self.rightKeyMenu.add_command(label='汉字重选(R)')
self.rightKeyMenu.add_command(label='使用 Bing 搜索(B)...')
# 插入 Unicode 控制字符(I)的三级菜单栏添加 ... 项
self.threeRightMenu.add_command(label='特殊字符1')
self.threeRightMenu.add('command', label='特殊字符2')
self.threeRightMenu.insert(3, 'command', label='特殊字符3')
# ...
# 菜单之间插入分隔线
self.rightKeyMenu.insert_separator(1)
self.rightKeyMenu.insert_separator(6)
self.rightKeyMenu.insert_separator(8)
self.rightKeyMenu.insert_separator(12)
self.rightKeyMenu.insert_separator(15)
# 捆绑鼠标右键事件
self.bind('<Button-3>', lambda event: self.rightKeyEvent(event, self.rightKeyMenu))
""" 底行内容显示 """
# 底部内容框架
self.bottomFrame = tk.Frame(self)
self.bottomFrame.pack(side=tk.BOTTOM, fill='both')
# 状态栏框架
self.stateFrame = tk.Frame(self.bottomFrame, borderwidth=2, relief=tk.GROOVE)
self.stateFrame.pack(side=tk.BOTTOM, fill='both')
# 字符编码
self.charCodeLabel = tk.Label(self.stateFrame,text=' UTF-8',width=16,anchor='w',borderwidth=2,relief='groove')
self.charCodeLabel.pack(side=tk.RIGHT)
# 换行方式(回车换行)
self.CRLFlabel = tk.Label(self.stateFrame,text=' Windows (CRLF)',width=17,anchor='w',borderwidth=2,relief='groove')
self.CRLFlabel.pack(side=tk.RIGHT)
# 字体大小
self.fontSizeLabel = tk.Label(self.stateFrame, text='100%', width=6, borderwidth=2, relief='groove')
self.fontSizeLabel.pack(side=tk.RIGHT)
# 光标位置
self.locationLabel = tk.Label(self.stateFrame,text=' 第 1 行,第 1 列',width=19,anchor='w',borderwidth=2,relief='groove')
self.locationLabel.pack(side=tk.RIGHT)
# 空白填充(也可以按需显示内容)
self.blankLabel = tk.Label(self.stateFrame, text='欢迎使用记事本', borderwidth=2, relief='groove')
self.blankLabel.pack(fill=tk.BOTH)
# 右侧滚动条
self.rightScrollbar = tk.Scrollbar(self, orient='vertical')
self.rightScrollbar.pack(side=tk.RIGHT, fill='both')
# 底侧滚动条
self.bottomScrollbar = tk.Scrollbar(self.bottomFrame, orient="horizontal")
self.bottomScrollbar.pack(side=tk.BOTTOM, fill='both')
# 文本编辑区域
self.text = tk.Text(self)
self.text.pack(expand=True, fill='both')
# 将焦点设置到Text控件上
self.text.focus()
# 修改窗口标题的图片
self.notepad_photo = tk.PhotoImage(file='.\\..\\photo\\记事本.png')
self.iconphoto(True, self.notepad_photo)
# Text文本鼠标右键菜单事件
def rightKeyEvent(self, event, object):
object.post(event.x_root, event.y_root)
# 代码测试
if __name__ == '__main__':
ui = Notepad_base() # 实例化记事本UI
ui.mainloop() # 循环窗口运行
else:
print(f'导入【{__name__}】')
作者:周华
传作日期:2024/1/9