【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 tkclass 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()   # 实例化记事本UIui.mainloop()         # 循环窗口运行
else:print(f'导入【{__name__}】')

作者:周华

传作日期:2024/1/9

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql生成到当前时间的时间序列,报表按时间补0

生成本月每日的时间序列 SELECT DATE_FORMAT(date_add( CONCAT(YEAR(Date(curdate())),‘-0’,MONTH(Date(curdate())),‘-’,‘01’), INTERVAL ( cast( help_topic_id AS signed) ) DAY ) ,‘%Y-%m-%d’ ) FROM mysql.help_topic WHERE help_topic_id < DAY ( curdate( ) …

理解接雨水算法

一、IDEA注释显示图片 在做题时&#xff0c;需要对照这图片&#xff0c;才能更好的梳理思路。 首先&#xff0c;注释里添加<img/>标签 之后&#xff0c;将鼠标光标放置在需要以阅读模式预览注释的地方&#xff0c;然后按快捷键CtrlAltQ即可 二、接雨水算法 先看接雨水…

Zustand 状态管理

Zustand 状态管理 安装创建 Store给 Store 添加TS类型约束在页面使用 Store返回 Store 中所有状态在 Store 中使用 async 异步方法使用 Immer Middleware (中间件) 更新深层嵌套的 State使用 get 方法&#xff0c;在 set 方法外访问 State 中的数据使用 selector什么是 selecto…

Python猜数游戏

文章目录 1 Game Rule2 Code3 Result 1 Game Rule 猜数字游戏目的是猜测出程序想出的数字&#xff0c;基本逻辑&#xff1a; 程序随机选择1到100之间的一个数字或任何其他数字组合&#xff1b; 然后它会要求玩家输入它的建议&#xff1b; 然后它会检查这个数字是否与计算机随…

全网独家:基于openEuler-20.03-LTS-SP4底包构建opengaussV5.0.1LTS的单机极简版数据库容器

本文尝试基于openEuler-20.03-LTS-SP4底包构建opengaussV5.0.1LTS的单机版极简版数据库容器。 一、软件包源 1、openEuler-20.03-LTS容器底包 openEuler-20.03-LTS-SP4 下载链接 sha256:24d8f51c1f3a79eb975c4e498cadd9055bfd708d66c15935ec46664d0f975a7b openEuler-dock…

计算机网络—— 概述

概述 1.1 因特网概述 网络、互联网和因特网 网络由若干结点和连接这些结点的链路组成多个网络还可以通过路由器互联起来&#xff0c;这样就构成了一个覆盖范围更大的网络&#xff0c;即互联网&#xff08;或互连网&#xff09;。因特网&#xff08;Internet&#xff09;是世…

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

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

3d模型为什么只显示线是什么原因怎么解决---模大狮模型网

在3D建模中&#xff0c;有时我们会遇到模型只显示线框&#xff0c;而没有填充色或纹理的情况。这种问题可能会导致场景的不协调和视觉效果的不理想&#xff0c;影响到我们的设计效率和效果。本文将探讨一些可能导致该问题的原因&#xff0c;并提供解决方法&#xff0c;以帮助您…

WPS Office找回丢失的工作文件

WPS office恢复办公文件方法有两种. 1.通过备份中心可以查看近期编辑 office 历史版本进行恢复. 2.缓存备份目录可以查看编辑过的 office 文件的历史版本&#xff0c;新版本 WPS 可以在配置工具-备份清理找到&#xff0c;2019 年旧版本 WPS 可以在新建任意 office 文件-文件-选…

城堡世界源码

随着数字技术的飞速发展和人们对于娱乐需求的不断提升&#xff0c;城堡世界源码开发逐渐成为了新的热门话题。城堡世界是一个集潮流、艺术、科技于一体的数字娱乐新领域&#xff0c;通过将虚拟现实、增强现实等技术融入传统玩具设计中&#xff0c;为玩家们带来了全新的互动体验…

【大数据架构】OLAP实时分析引擎选型

常见OLAP引擎对比 OLAP分析场景中&#xff0c;一般认为QPS达到1000就算高并发&#xff0c;而不是像电商、抢红包等业务场景中&#xff0c;10W以上才算高并发&#xff0c;毕竟数据分析场景&#xff0c;数据海量&#xff0c;计算复杂&#xff0c;QPS能够达到1000已经非常不容易 …

基于 SpringBoot + magic-api + Vue3 + Element Plus + amis3.0 快速开发管理系统

Tansci-Boot 基于 SpringBoot2 magic-api Vue3 Element Plus amis3.0 快速开发管理系统 Tansci-Boot 是一个前后端分离后台管理系统&#xff0c; 前端集成 amis 低代码前端框架&#xff0c;后端集成 magic-api 的接口快速开发框架。包含基础权限、安全认证、以及常用的一…