当前位置: 首页 > news >正文

Python 使用tkinter复刻Windows记事本UI和菜单(二)

上一篇:Python tkinter实现复刻Windows记事本UI和菜单的文本编辑器(一)-CSDN博客

下一篇:敬请耐心等待,如发现BUG以及建议,请在评论区发表,谢谢!

相对上一篇文章,本篇文章的文本编辑器UI与Windows的记事本不能说是一毛一样,但绝对是失散多年的双胞胎集美。不仅长着一样的外表,内心还像周公辣么大,装着十个海王,根本吃不完。总而言之,言而总之,泰库辣!!!

运行结果

设计代码

"""
    文本编辑器
"""

# 通配符
__all__ = ['main']


# 鼠标右键菜单
def rightKeyEvent(event, object):
    object.post(event.x_root, event.y_root)


# 主函数
def main():
    import tkinter as tk
    from tkinter import font
    base = tk.Tk()              # 新建一个窗口
    base.title('文本编辑器')     # 窗口标题
    base.geometry(f'750x550+{base.winfo_screenwidth()//4}+{base.winfo_screenheight()//8}')

    # 菜单栏
    menubar = tk.Menu(base)
    base.config(menu=menubar)

    # 二级菜单 文件
    fileMenu = tk.Menu(menubar, tearoff=0)
    fileMenu.add_command(label=f'新建(N){" "*28}Ctrl+N')
    fileMenu.add_command(label=f'新窗口(W){" "*16}Ctrl+Shift+N')
    fileMenu.add_command(label=f'打开(O)...{" "*26}Ctrl+O')
    fileMenu.add_command(label=f'保存(S){" "*29}Ctrl+S')
    fileMenu.add_command(label=f'另存为(A)...{" "*15}Ctrl+Shift+S')
    fileMenu.add_command(label=f'页面设置(U)...')
    fileMenu.add_command(label=f'打印(P)...{" "*27}Ctrl+P')
    fileMenu.add_command(label=f'退出(X)')
    menubar.add_cascade(label='文件(F)', menu=fileMenu)

    # 二级菜单 编辑
    editMenu = tk.Menu(menubar, tearoff=0)
    editMenu.add_command(label=f'撤销(U){" "*26}Ctrl+Z')
    editMenu.add_command(label=f'剪切(T){" "*26}Ctrl+X')
    editMenu.add_command(label=f'复制(C){" "*26}Ctrl+C')
    editMenu.add_command(label=f'粘贴(V){" "*26}Ctrl+V')
    editMenu.add_command(label=f'删除(L){" "*27}Delete')
    editMenu.add_command(label=f'使用 Bing 搜索...{" "*14}Ctrl+E')
    editMenu.add_command(label=f'查找(F)...{" "*25}Ctrl+F')
    editMenu.add_command(label=f'查找上一个(N){" "*23}F3')
    editMenu.add_command(label=f'查找下一个(V){" "*15}Shift+F3')
    editMenu.add_command(label=f'替换(R)...{" "*23}Ctrl+H')
    editMenu.add_command(label=f'转到(G)...{" "*23}Ctrl+G')
    editMenu.add_command(label=f'全选(A){" "*26}Ctrl+A')
    editMenu.add_command(label=f'时间/日期(D){" "*25}F5')
    menubar.add_cascade(label='编辑(E)', menu=editMenu)

    # 二级菜单 格式
    integer1 = tk.IntVar()
    formatMenu = tk.Menu(menubar, tearoff=0)
    formatMenu.add_checkbutton(label='自动换行(W)', variable=integer1, onvalue=0, offvalue=1)
    formatMenu.add_command(label='字体(F)...')
    menubar.add_cascade(label='格式(O)', menu=formatMenu)

    # 二级菜单 查看
    integer2 = tk.IntVar()
    checkMenu = tk.Menu(menubar, tearoff=0)
    # 三级菜单 缩放(Z)
    twoCheckMenu = tk.Menu(checkMenu, tearoff=0)
    twoCheckMenu.add_command(label=f'放大(I){" "*14}Ctrl + 加号')
    twoCheckMenu.add_command(label=f'缩小(O){" "*13}Ctrl + 减号')
    twoCheckMenu.add_command(label=f'恢复默认缩放{" "*11}Ctrl+0')
    checkMenu.add_cascade(label='缩放(Z)', menu=twoCheckMenu)
    checkMenu.add_checkbutton(label='状态栏(S)', variable=integer2, onvalue=0, offvalue=1)
    menubar.add_cascade(label='查看(V)', menu=checkMenu)

    # 二级菜单 帮助
    helpMenu = tk.Menu(menubar, tearoff=0)
    helpMenu.add_command(label='查看帮助(H)')
    helpMenu.add_command(label='发送反馈(F)')
    helpMenu.add_command(label='关于文本编辑器(A)')
    menubar.add_cascade(label='帮助(H)', menu=helpMenu)

    # 右键菜单
    rightKeyMenu = tk.Menu(base, tearoff=0)
    rightKeyMenu.add_command(label='撤销(U)')
    rightKeyMenu.add_command(label='剪切(T)')
    rightKeyMenu.add_command(label='复制(C)')
    rightKeyMenu.add_command(label='粘贴(P)')
    rightKeyMenu.add_command(label='删除(D)')
    rightKeyMenu.add_command(label='全选(A)')
    rightKeyMenu.add_checkbutton(label='从右到左的阅读顺序(R)')
    rightKeyMenu.add_checkbutton(label='显示 Unicode 控制字符(S)')
    # 三级级菜单 插入 Unicode 控制字符(I)
    twoRightMenu = tk.Menu(rightKeyMenu, tearoff=0)
    twoRightMenu.add_command(label='特殊字符')
    # ...
    rightKeyMenu.add_cascade(label='插入 Unicode 控制字符(I)', menu=twoRightMenu)
    rightKeyMenu.add_command(label='关闭输入法(L)')
    rightKeyMenu.add_command(label='汉字重选(R)')
    # 捆绑鼠标右键事件
    base.bind('<Button-3>', lambda event: rightKeyEvent(event, rightKeyMenu))

    # 底行内容显示
    bottomFrame = tk.Frame(base, borderwidth=2, relief=tk.GROOVE)
    bottomFrame.pack(side=tk.BOTTOM, fill='both')
    # 字符编码
    charCodeLabel = tk.Label(bottomFrame, text=' UTF-8', width=16, anchor='w', borderwidth=2, relief=tk.GROOVE)
    charCodeLabel.pack(side=tk.RIGHT)
    # 换行方式(回车换行)
    CRLFlabel = tk.Label(bottomFrame, text=' Windows (CRLF)', width=17, anchor='w', borderwidth=2, relief=tk.GROOVE)
    CRLFlabel.pack(side=tk.RIGHT)
    # 字体大小
    fontSizeLabel = tk.Label(bottomFrame, text='100%', width=6, borderwidth=2, relief=tk.GROOVE)
    fontSizeLabel.pack(side=tk.RIGHT)
    # 光标位置
    locationLabel = tk.Label(bottomFrame, text='  第 1 行,第 1 列', width=19, anchor='w', borderwidth=2, relief=tk.GROOVE)
    locationLabel.pack(side=tk.RIGHT)

    # 右侧滚动条
    scrollbar = tk.Scrollbar(base)
    scrollbar.pack(side=tk.RIGHT, fill='both')

    # 文本编辑区域
    setFont = font.Font(family='Tahoma', size=12)
    textData = tk.Text(base, wrap='word', yscrollcommand=scrollbar.set, font=setFont)
    textData.pack(fill='both', expand=True)
    scrollbar.config(command=textData.yview)

    # 修改窗口标题的图片
    icon = tk.PhotoImage(file='.\\..\\photo\\记事本.png')
    base.iconphoto(True, icon)

    base.mainloop()             # 窗口主循环


# 代码测试
if __name__ == '__main__':
    main()
else:
    print(f'导入{__name__}模块')

作者:周华

创作日期:2023/11/9

相关文章:

  • K8S篇之Pod中的资源限额
  • HTTPS的工作流程
  • 输入一个url后,会发生什么事?
  • Flink 基础 -- 应用开发(Table API SQL) Table API
  • npm 下载包失败解决方案
  • 内网如何使用Python第三方库包(举例JustinScorecardPy)
  • 第十三章《搞懂算法:神经网络是怎么回事》笔记
  • 基于Qt Linux开发板USER-KEY按键实现
  • uboot - 驱动开发 - dw watchdog
  • [autojs]逍遥模拟器和vscode对接
  • 通义千问, 文心一言, ChatGLM, GPT-4, Llama2, DevOps 能力评测
  • 原始html和vue中使用3dmol js展示分子模型,pdb文件
  • mysql,redis导入导出数据库数据
  • RustRover里使用AI通义灵码来写代码
  • IDEA插件开发--持久化配置信息方案
  • play() failed because the user didn‘t interact with the document first.
  • 路径加密(替换空格),剑指offer,力扣
  • 使用iperf3在macOS上进行网络性能测试
  • python flask_restful “message“: “Failed to decode JSON object: None“
  • Redis6的IO多线程分析
  • 多图|多款先进预警机亮相雷达展,专家:中国预警机已达世界先进水平
  • 江南考古文脉探寻
  • 以色列媒体:哈马斯愿意释放部分人员换取两个月停火
  • 高新波任西安电子科技大学校长
  • 阿联酋与美国达成超过2000亿美元协议
  • 国防部:中方愿与俄方不断增强两军关系良好发展势头