【Python】使用tkinter设计开发Windows桌面程序记事本(1)

 下一篇:

记事本介绍

电脑记事本是一种简单的文本编辑器,用于在电脑上创建、编辑和存储文本文件。它通常被用作轻量级的文本编辑工具,适用于简单的文本编辑任务,如写日记、做笔记、编写代码等。以下是对电脑记事本的详细介绍:

  1. 功能特点:
  • 创建和编辑文本文件:电脑记事本可用于创建新的文本文件或编辑现有的文本文件。用户可以直接输入文本,或者粘贴从其他地方复制的文本。
  • 保存文本文件:记事本可以保存文本文件为纯文本格式,不会包含任何格式信息。这意味着保存的文本将只显示实际输入的字符,而不显示格式、颜色或其他附加信息。
  • 打开多种文件格式:记事本通常可以打开和编辑多种文件格式,如TXT、INI、BAT等。
  1. 使用体验:
  • 轻量级工具:记事本通常占用的内存和空间都很小,不会给电脑带来太多负担。
  • 易于使用:记事本的界面通常非常简洁,易于使用。用户可以轻松地打开、编辑和保存文本文件。
  • 快速打开:由于记事本的功能相对简单,所以它的启动速度通常很快。
  1. 兼容性:电脑记事本通常与Windows操作系统兼容,可以在Windows电脑上运行。
  2. 安全性:记事本通常没有额外的安全功能,但保存的文本文件本身通常不会包含恶意代码或病毒。
  3. 价格:记事本通常是Windows操作系统的一部分,不需要额外购买。

总的来说,电脑记事本是一种简单、易用的文本编辑工具,适用于基本的文本编辑任务。虽然它的功能相对有限,但对于简单的任务来说已经足够。如果你需要更高级的文本编辑功能,可以考虑使用更专业的文本编辑器或写作软件。

作者发炎

这个项目之前做过一版,可读性欠缺火候,对此我将重新梳理代码,分阶段在博客分享。

本文章可以说是大部分还原了记事本的UI以及菜单(包括鼠标右键菜单)。

在第一篇只完成记事本UI设计,并没有绑定触发条件,所以无具体功能实现。

倘若有疑问或建议请在评论区畅所欲言!

设计步骤

首先新建一个项目文件夹,并且命名为"记事本项目",然后在其目录下再新建三个文件夹,分别为"code"(用于存放代码)、"data"(用于存放数据)、"photo"(用于存放图片)。

运行结果

代码示例:记事本底座.py

"""
    记事本底座
"""

# 通配符 "*"
__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

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

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

相关文章

【LLM 论文阅读】NEFTU N E: LLM微调的免费午餐

指令微调的局限性 指令微调对于训练llm的能力至关重要&#xff0c;而模型的有用性在很大程度上取决于我们从小指令数据集中获得最大信息的能力。在本文中&#xff0c;我们提出在微调正向传递的过程中&#xff0c;在训练数据的嵌入向量中添加随机噪声&#xff0c;论文实验显示这…

k8s的存储卷

存储卷------数据卷 把容器内的目录&#xff0c;和宿主机的目录进行挂载。 容器在系统上的生命周期是短暂的&#xff0c;delete&#xff0c;k8s用控制&#xff08;deployment&#xff09;创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会回复到初始状态。 …

中国京津冀光伏展

京津冀在中国光伏展是中国光伏行业的一次重要展览活动&#xff0c;旨在推动京津冀地区光伏产业的发展和合作&#xff0c;促进全国光伏产业的健康发展。 京津冀地区是中国光伏产业的重要基地之一&#xff0c;拥有丰富的太阳能资源和发展潜力。中国光伏展作为光伏行业的盛会&…

firewall防火墙(二)

一、IP伪装与端口转发&#xff1a; 当用户数据包经过NAT设备时&#xff0e;NAT设备将源地址替换为公网P地址&#xff0e;而返回的数据包就可以被路由&#xff0c;NAT技术一般都是在企业边界路由器或者防火墙上来配置. Firewaild支持两种类型的NAT;P地址伪装和端口转发. 1.1 I…

优化 ParamValidator,让编辑器Pycharm智能提示校验方法

目录 一、前置说明1、总体目录2、相关回顾3、本节目标 二、操作步骤1、项目目录2、代码实现3、测试代码4、日志输出 三、后置说明1、要点小结2、下节准备 一、前置说明 1、总体目录 《 pyparamvalidate 参数校验器&#xff0c;从编码到发布全过程》 2、相关回顾 基于 Valid…

鱼哥赠书活动第⑥期:《内网渗透实战攻略》看完这本书教你玩转内网渗透测试成为实战高手!!!!

鱼哥赠书活动第⑥期&#xff1a;《内网渗透实战攻略》 如何阅读本书&#xff1a;本书章节介绍&#xff1a;本书大致目录&#xff1a;适合阅读对象&#xff1a;赠书抽奖规则:往期赠书福利&#xff1a; 当今&#xff0c;网络系统面临着越来越严峻的安全挑战。在众多的安全挑战中&…

产品使用说明书也能进行SEO?要怎么制作才能使其易于搜索?

产品使用说明书也能进行SEO&#xff1f;是的&#xff0c;你没有听错&#xff0c;不过是在线化的产品使用说明书。产品使用说明书能通过特定的策略和技巧进行搜索引擎优化&#xff08;SEO&#xff09;。这不只是为了让产品信息更易被找到&#xff0c;更是为了提升品牌知名度和用…

ubuntu20.04安装cuda11.4以及cudnn

系统&#xff1a;ubuntu20.04硬件配置&#xff1a;GPU3080、CPU未知通过《软件和更新》在附加驱动选项中添加了驱动&#xff1a; 1.检查自己电脑支持的cuda nvidia-smi4. 下载cuda11.4.2 wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/c…

昇腾910b部署qwen-7b-chat进行流式输出【pytorch框架】NPU推理

文章目录 准备阶段避坑阶段解决方案一、modeling_qwen.py二、cli_demo.py 结果展示 准备阶段 参考我上一篇文章910b上跑Chatglm3-6b进行流式输出【pytorch框架】 避坑阶段 我在mindspore框架下运行了qwen-7b-base、qwen-7b-chat输出都有大大的问题&#xff0c;参考官方文档 …

C++qt-信号-信号槽

1、概念 信号和槽是两种函数&#xff0c;这是Qt在C基础上新增的特性&#xff0c;类似于其他技术中的回调的概念。 信号和槽通过程序员提前设定的“约定”&#xff0c;可以实现对象之间的通信&#xff0c;有两个先决的条件&#xff1a; 通信的对象必须都是从QObject类中派生出来…

iOS 应用上架指南:资料填写及提交审核

摘要 本文提供了iOS新站上架资料填写及提交审核的详细指南&#xff0c;包括创建应用、资料填写-综合、资料填写-IOS App和提交审核等步骤。通过本指南&#xff0c;您将了解到如何填写正确的资料&#xff0c;并顺利通过苹果公司的审核。 引言 在开发iOS应用后&#xff0c;将其…

视频监控系统EasyCVR如何通过调用API接口查询和下载设备录像?

智慧安防平台EasyCVR是基于各种IP流媒体协议传输的视频汇聚和融合管理平台。视频流媒体服务器EasyCVR采用了开放式的网络结构&#xff0c;支持高清视频的接入和传输、分发&#xff0c;平台提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联…

oracle基本用户管理和权限分配

1.用户与模式的关系&#xff0c;一一对应的关系 2.创建与管理用户 2.1创建用户语法 CREATE user wdf IDENTIFIED by tiger--创建用户wdf,密码tiger DEFAULT tablespace users--用户的默认表空间 quota 10M on users;--在表空间的占用最大空间 注意&#xff1a;用户创建以后…

基于TableAgent实现IT职位招聘数据分析—以传统机器学习与TableAgent 数据分析方式相对比以凸显TableAgent 特性

目录 &#x1f680;一. TableAgent—新AI时代的数据分析智能体 &#x1f50e;1.1 基于DataCanvas Alaya九章元识大模型 &#x1f50e;1.2 TableAgent的亮点 &#x1f680;二. 使用TableAgent分析数据与传统机器学习分析数据对比 &#x1f50e;2.1 项目背景 &#x1f50e;2.2 数…

统信UOS命令行设置未签名软件安装权限

原文链接&#xff1a;统信UOS命令行设置未签名软件安装权限 hello&#xff0c;大家好啊&#xff01;今天我要给大家介绍的是在统信UOS操作系统上通过命令行设置安全中心应用安装权限的方法。在某些情况下&#xff0c;用户可能需要安装未经官方签名的软件包。虽然这可以提供更多…

在python里面探索web框架

一、常识性知识 python Web框架三巨头&#xff1a;Flask&#xff08;简单易学&#xff09;、Django(复杂庞大)、FastAPI 1. Django&#xff1a;Django是一个高级的Web框架&#xff0c;它提供了强大的功能和工具&#xff0c;用于快速开发复杂的Web应用程序。 2. Flask&#xff…

2024 CSRankings全球计算机科学排名发布!清华AI第一,哈工大NLP第一

大家好我是二狗。 这两天全球计算机科学排名 CSRankings 2024发布啦&#xff01; 下面二狗就带大家来看一下最新的排名情况。 清华、北大、上海交大AI领域霸榜前三 在AI板块&#xff0c;主要有人工智能、计算机视觉、机器学习、自然语言处理、网络&信息检索5个细分领域。…

【obj To 3DTiles 格式转换】 可以自定义经纬高、属性表等参数 (一)

目录 0 引言1 3DTiles数据2 objTo3DTiles2.1 工具的安装2.1.1 拓展&#xff1a;Node.js 和 npm 2.2 工具的使用2.2.1 输出成瓦片数据2.2.2 输出带有坐标参数的瓦片数据 3 查看3DTiles数据 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;Cesiumfor…

玄子Share-云计算入门指南

玄子Share-云计算入门指南 一、Windows 键盘字符输入 1. 单键位 直接通过键盘输入即可 2. 双键位 功能键&#xff0c;键盘上显示为两排符号&#xff0c;普通输入模式默认输入下排字符&#xff0c;键盘按下Shift&#xff08;转换&#xff09;键&#xff0c;上档键&#xff0…

8 单链表---带表头节点

上节课所学的顺序表的缺点 顺序表的最大问题&#xff1a;插入和删除时需要移动大量元素 链式存储的定义 链式存储的逻辑结构 链表中的基本概念&#xff1a; 注意&#xff1a;表头节点并不属于数据元素 单链表图示&#xff1a; 把3个需要的结构体定义出来&#xff1a; typdef …