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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/134247.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字化仪的超声波应用

超声波是频率大于人类听觉范围上限的声学声压&#xff08;声学&#xff09;波。超声波设备的工作频率为 20 kHz 至几千 MHz。表 1 总结了一些更常见的超声波应用的特征。每个应用中使用的频率范围都反映了实际情况下的平衡。提高工作频率可以通过提高分辨率来检测较小的伪影&am…

JAVA集合学习

一、结构 List和Set继承了Collection接口&#xff0c;Collection继承了Iterable Object类是所有类的根类&#xff0c;包括集合类&#xff0c;集合类中的元素通常是对象&#xff0c;继承了Object类中的一些基本方法&#xff0c;例如toString()、equals()、hashCode()。 Collect…

时间序列预测实战(九)PyTorch实现LSTM-ARIMA融合移动平均进行长期预测

一、本文介绍 本文带来的是利用传统时间序列预测模型ARIMA(注意&#xff1a;ARIMA模型不属于机器学习)和利用PyTorch实现深度学习模型LSTM进行融合进行预测&#xff0c;主要思想是->先利用ARIMA先和移动平均结合处理数据的线性部分&#xff08;例如趋势和季节性&#xff09…

【mysql】将逗号分割的字段内容转换为多行并group by

先说需求&#xff1a; 公司想让我通过mysql导出一个报表&#xff0c;内容为公司每个人参加会议的次数&#xff0c;现在有一个会议表fusion_meeting&#xff0c;正常的逻辑是通过人员直接group by就可以得出结果&#xff0c;但是我们的参会人是通过逗号分割这种方式存在一个字段…

【MySQL基本功系列】第二篇 InnoDB事务提交过程深度解析

通过上一篇博文&#xff0c;我们简要了解了MySQL的运行逻辑&#xff0c;从用户请求到最终将数据写入磁盘的整个过程。 当数据写入磁盘时&#xff0c;存储引擎扮演着关键的角色&#xff0c;它负责实际的数据存储和检索。 在MySQL中&#xff0c;有多个存储引擎可供选择&#xf…

vColorPicker——基于 Vue 的颜色选择器插件

文章目录 前言样例特点 一、使用步骤&#xff1f;1. 安装2.引入3.在项目中使用 vcolorpicker 二、选项三、事件 前言 vColorPicker——官网 vColorPicker——GitHub 样例 vColorPicker是基于 Vue 的一款颜色选择器插件&#xff0c;仿照Angular的color-picker插件制作 特点 …

【GIT】git分支命令,使用分支场景介绍git标签介绍,git标签命令,git标签使用的场景git查看提交历史

目录 一&#xff0c;git分支命令&#xff0c;使用分支场景介绍 二&#xff0c;git标签介绍&#xff0c;git标签命令&#xff0c;git标签使用的场景 三&#xff0c;git查看提交历史 前言&#xff1a; 今天我们来聊聊关于Git 分支管理。几乎每一种版本控制系统都以某种形式支持…

第24章_mysql性能分析工具的使用

文章目录 1. 数据库服务器的优化步骤2.查看系统性能参数3. 统计SQL的查询成本&#xff1a;last_query_cost4. 定位执行慢的 SQL&#xff1a;慢查询日志4.1 开启慢查询日志参数4.2 查看慢查询数目4.3 测试慢sql语句&#xff0c;查看慢日志4.4 系统变量 log_output&#xff0c; l…

【蓝桥杯 第十三届省赛Java B组】真题训练(A - F)

目录 A、星期计算 - BigInteger B、山 - 暴力判断 字符串 C、字符统计 - 简单哈希 D、最少刷题数 - 排序 思维 二分 分情况讨论 &#xff08;1&#xff09;&#xff08;错误&#xff09;自写哈希表 &#xff08;2&#xff09;正解 E、求阶乘 - 数学思维 二分 F、…

SAP实现文本框多行输入(类cl_gui_textedit)

参考文章&#xff1a;https://blog.csdn.net/SAPmatinal/article/details/130882962 先看效果&#xff0c;在输入框先来一段《赤壁赋》 然后点击 ‘保存输出’按钮&#xff0c;就能把输入内容从表里读取并输出来 源代码&#xff1a; *&-------------------------------…

多个div横向排列的几种方法

以下面这组 div 为例&#xff0c;group的高度由内容撑开 <div id"group"><div id"div1">div1</div><div id"div2">div2</div><div id"div3">div3</div> </div>显示结果如下为上下排…

Go常见数据结构的实现原理——map

&#xff08;一&#xff09;基础操作 版本&#xff1a;Go SDK 1.20.6 1、初始化 map分别支持字面量初始化和内置函数make()初始化。 字面量初始化&#xff1a; m : map[string] int {"apple": 2,"banana": 3,}使用内置函数make()初始化&#xff1a; m …

19.删除链表的倒数第N个结点(LeetCode)

想法一 先用tail指针找尾&#xff0c;计算出节点个数&#xff0c;再根据倒数第N个指定删除 想法二 根据进阶的要求&#xff0c;只能遍历一遍链表&#xff0c;那刚刚想法一就做不到 首先&#xff0c;我们要在一遍内找到倒数第N个节点&#xff0c;所以我们设置slow和fast两个指…

Python----元组的定义与使用

1、为什么需要元组 思考&#xff1a;如果想要存储多个数据&#xff0c;但是这些数据是不能修改的数据&#xff0c;怎么做&#xff1f; 首先&#xff0c;列表可以一次性存储多个数据&#xff0c;但是列表中的数据允许更改。 相关链接&#xff1a;Python--列表及其应用场景-CS…

Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks - 翻译学习

知识密集型NLP任务的检索增强生成 - 论文学习 文章目录 Abstract1 Introduction2 Methods2.1 Models2.2 Retriever: DPR2.3 Generator: BART2.4 Training2.5 Decoding 3 Experiments3.1 Open-domain Question Answering3.2 Abstractive Question Answering3.3 Jeopardy Questio…

[工业自动化-14]:西门子S7-15xxx编程 - 软件编程 - STEP7 TIA博途是全集成自动化软件TIA portal快速入门

目录 一、TIA博途是全集成自动化软件TIA portal快速入门 1.1 简介 1.2 软件常用界面 1.3 软件安装的电脑硬件要求 1.4 入口 1.5 主界面 二、PLC软件编程包含哪些内容 2.1 概述 2.2 电机运动控制 一、TIA博途是全集成自动化软件TIA portal快速入门 1.1 简介 Siemens …

Leetcode -463.岛屿的周长 - 476.数字的补码

Leetcode Leetcode -463.岛屿的周长Leetcode - 476.数字的补码 Leetcode -463.岛屿的周长 题目&#xff1a;给定一个 row x col 的二维网格地图 grid &#xff0c;其中&#xff1a;grid[i][j] 1 表示陆地&#xff0c; grid[i][j] 0 表示水域。 网格中的格子 水平和垂直 方向…

小样本目标检测(Few-Shot Object Detection)综述

背景 前言:我的未来研究方向就是这个,所以会更新一系列的文章,就关于FSOD,如果有相同研究方向的同学欢迎沟通交流,我目前研一,希望能在研一发文,目前也有一些想法,但是具体能不能实现还要在做的过程中慢慢评估和实现.写文的主要目的还是记录,避免重复劳动,我想用尽量简洁的语言…

MATLAB的编程与应用,匿名函数、嵌套函数、蒙特卡洛法的掌握与使用

目录 1.匿名函数 1.1.匿名函数的定义与分类 1.2.匿名函数在积分和优化中应用 2.嵌套函数 2.1.嵌套函数的定义与分类 2.2.嵌套函数彼此调用关系 2.3.嵌套函数在积分和微分中应用 3.微分和积分 4.蒙特卡洛法 4.1.圆周率的模拟 4.2.计算N重积分&#xff08;均匀分布&am…

计算机毕业设计 基于Springboot的影院购票管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…