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

news2024/11/17 23:35:45

 下一篇:

记事本介绍

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

  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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode刷题--- 最小路径和

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动…

wireshark使用教程

目录 windows平台安装Wireshark组件选择Additional TasksPacket CaptureUSB CaptureNpcap Installation Options Ubuntu上安装 Wireshark不使用 sudo 运行 Wireshark 使用GUI抓包使用命令行抓包确定抓取哪个网卡的报文抓取数据包停止抓包设置过滤条件 参考资料 Wireshark 是一款…

救赎之道,就在其中

时光荏苒&#xff0c;不知不觉距离我踏入职场的第一天已经快一年了。最近也是看到平台举办年度征文活动&#xff0c;借此契机重新审视自己这两年来的成长历程&#xff0c;也希望对正在迷茫的人提供一些精神上的慰藉。 1.对未来的迷茫 如果要给两年前的自己打上标签&#xff0…

Flink-CEP 实战教程

文章目录 1. 基本概念1.1 CEP 是什么1.2 模式&#xff08;Pattern&#xff09;1.3 应用场景 2. 快速上手2.1 引入依赖2.2 入门实例 3. 模式API&#xff08;Pattern API&#xff09;3.1 个体模式3.1.1 基本形式3.1.2 量词&#xff08;Quantifiers &#xff09;3.1.3 条件&#x…

KVM系统虚拟化性能测试过程总结

buildroot编译 为啥要用buildroot 支持很多&#xff1a;交叉编译工具链、根文件系统生成、内核映像编译和引导加载程序编译。使用简单&#xff1a;使用类似内核的menuconfig、gconfig和xconfig配置界面&#xff0c;使用buildroot构建基本系统很容易。支持很多的包&#xff1a…

蓝凌EIS智慧协同平台 ShowUserInfo.aspx sql注入漏洞

漏洞描述&#xff1a; 蓝凌EIS智慧协同平台是一个简单、高效的工作方式专为成长型企业打造的沟通、协同、社交的移动办公平台&#xff0c;覆盖OA、沟通、客户、人事、知识等管理需求&#xff0c;集合了非常丰富的模块&#xff0c;满足组织企业在知识、项目管理系统建设等需求的…

[Linux进程(一)] 什么是进程?PCB的底层是什么?以及进程标识符pid与ppid

文章目录 1、前言2、描述进程 — PCB(os怎么管理进程呢)3、查看进程3.1 方法一3.2 方法二 4、系统调用获取进程标示符(PID)4.1 获取进程的ID4.2 获取进程的父进程ID 5、系统调用创建子进程-fork 1、前言 大家经常都在讲进程&#xff0c;而它到底是什么呢&#xff1f; 这里给大…

x-cmd pkg | dua - 磁盘使用分析器

目录 简介首次用户技术特点竞品和相关作品进一步阅读 简介 dua 是 Disk Usage Analyzer 的简写&#xff0c;该工具可以快速查看给定目录的磁盘空间使用情况。 对于想要深入了解磁盘空间使用情况并有效管理存储的用户来说&#xff0c;Dua 是一个很有价值的工具。通过使用 Dua …

Java流程控制的陷阱

文章目录 1. switch中break的作用2. switch支持的数据类型3. else隐含的条件4. 省略花括号的陷阱5. for循环的结构6. 使用标签跳出双层for循环 流程控制三种&#xff1a;顺序结构、分支结构、循环结构 分支机构两种&#xff1a;if语句、switch语句 循环结构&#xff1a;while循…

每日一篇英语文章分享:I have a dream. 争取早日阅读论文自由.

我有一个梦想》&#xff08;英文&#xff1a;I have a dream&#xff09;是美国黑人民权运动领袖马丁路德金于1963年8月28日在华盛顿林肯纪念堂发表的纪念性演讲。 《我有一个梦想》是马丁路德金在美国黑人受种族歧视和迫害由来已久的背景下&#xff0c;为了推动美国国内黑人争…

安达发|APS智能排产软件有哪些条件约束功能

APS智能排产软件是一种基于先进算法和人工智能技术的生产计划与调度系统&#xff0c;它可以帮助企业实现生产资源的优化配置&#xff0c;提高生产效率和降低生产成本。在实际应用中&#xff0c;APS智能排产软件需要满足多种条件约束功能&#xff0c;以满足不同企业的需求。以下…

python 和shell 变量互相传递

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 主要介绍python和shell变量互相传递方法&#xff0c;使用了环境变量、管道等方法。 python -> shell&#xff1a; 1.环境变量 import os var123或var123 o…

【手搓深度学习算法】用线性回归预测波士顿房价

线性回归 线性回归是一种监督学习方法&#xff0c;用于建立因变量与一个或多个自变量之间的关系。线性回归的目标是找到一条直线&#xff0c;使得所有数据点到这条直线的距离之和最小。 线性回归的基本形式如下&#xff1a; y β 0 β 1 x 1 β 2 x 2 . . . β n x n ϵ…

Linux学习之网络编程(纯理论)

写在前面 刚刚更新完Linux系统编程&#xff0c;特别推荐大家去看的Linux系统编程&#xff0c;总共44个小时&#xff0c;老师讲的非常好&#xff0c;我是十天肝完的&#xff0c;每天大概看20集&#xff0c;每天还要以写blog的形式来写笔记来总结一下&#xff0c;虽然这十天有点…

printk的使用与理解

文章目录 一、理清printk二、printk的使用三、printk的打印级别1、基本解释2、详细解释3、如何修改console_loglevel、default_message_loglevel、minimum_console_loglevel、default_console_loglevel的值 四、printk的输出地方五、其它 一、理清printk printk如何使用&#…

C++ 实现十大排序算法

教你手撕排序&#xff0c;这里有一个概念就是稳定排序。假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff0c;这些记录的相对次序保持不变&#xff0c;即在原序列中&#xff0c;r[i]r[j]&#xff0c;且r[i]在r[j]之前&#…

vim升级和配置

vim升级和配置 1、背景2、环境说明3、操作3.1 升级VIM3.2 配置VIM3.2.1、编辑vimrc文件3.2.2、安装插件 1、背景 日常工作跟linux系统打交道比较多&#xff0c;目前主要用到的是Cenots7和Ubuntu18这两个版本的linux系统&#xff0c;其中Centos7主要是服务器端&#xff0c;Ubun…

图神经网络|5.消息传递的计算方法 6.多层GNN的作用

5.消息传递的计算方法 边的存放方式 注意&#xff0c;在实际的边的实现方式中&#xff0c;并不是以邻接矩阵来进行实现的&#xff0c;这是因为在图的更新中&#xff0c;用邻接矩阵进行更新所占用的时间开销相对大&#xff0c;二是因为领接矩阵占用的空间大&#xff08;N方&am…

java数据结构与算法刷题-----LeetCode343. 整数拆分(TODO)

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

Apache JMeter 5.5: 新手指南

如何获取并运行 JMeter 首先&#xff0c;要使用 JMeter&#xff0c;你需要从官网获取软件包。前往 Apache JMeter 的官方页面&#xff0c;然后下载所 需的压缩文件。 配置和启动 JMeter 获取了 JMeter 后&#xff0c;由于它是无需安装即可使用的工具&#xff0c;直接解压下载…