Python|用tkinter实现自定义记事本

简介: Python使用tkinter实现自定义记事本。
Python中我们通常使用tkinter来进行UI界面的编写,本文我们来使用tkinter实现自定义记事本。

一、思考

想要完成记事本,我们首先需要考虑一个正常的记事本都需要具有哪些功能,我们将这些功能按键添加到我们的UI界面上即可。一般功能如下:

  • 新建文本文档
  • 打开本地文件
  • 保存文本文档
  • 功能项:剪切、复制、粘贴等

设定好了基本的功能选项之后我们再来思考实现记事本的思路。

  1. 创建记事本窗口
  2. 设定记事本菜单项
  3. 给不同的菜单项配置不同的功能选项
  4. 运行笔记本

二、代码实现

创建记事本窗口

创建窗口的时候,我们要设定好窗口的高度、宽度、文本区域以及各种菜单,与设定的内容如下:

class Notepad:

    root = Tk()
    '''
    Width:宽度
    Heith:高度
    TextArea:文本区域
    MenuBar:菜单栏
    FileMenu:文件菜单
    EditMenu:编辑菜单
    HelpMenu:帮助菜单
    ScrollBat:滚动条
    '''
    Width = 300
    Height = 300
    TextArea = Text(root)
    MenuBar = Menu(root)
    FileMenu = Menu(MenuBar, tearoff=0)
    EditMenu = Menu(MenuBar, tearoff=0)
    HelpMenu = Menu(MenuBar, tearoff=0)
    ScrollBar = Scrollbar(TextArea)
    file = None

设定记事本菜单项

设定好了基本的框架之后,接下来就是向整个框架中填入各种参数与配置项,包括菜单栏中各种功能选项、窗口标题、窗口位置等。

后续如果向添加新的功能在init函数中进行添加即可

菜单项代码示例:

def __init__(self, **kwargs):
    # 增加新建配置
    self.FileMenu.add_command(label="新建", command=self.__newFile)

    # 增加打开配置
    self.FileMenu.add_command(label="打开", command=self.__openFile)

    # 增加保存配置
    self.FileMenu.add_command(label="保存", command=self.__saveFile)

配置功能选项

接下来就是构建不同的功能函数,实现每一个小功能,这里不需要我们编写独立的功能函数代码,只需要使用tkinter中的函数进行再封装即可。

配置功能示例代码:

def __newFile(self):
    '''
    新文件:默认是一个未命名文件
    '''

    self.root.title("未命名文件")
    self.file = None
    self.TextArea.delete(1.0, END)

完整代码如下

import tkinter
import os
from tkinter import *
from tkinter.messagebox import *
from tkinter.filedialog import *


class Notepad:

    root = Tk()
    '''
    Width:宽度
    Heith:高度
    TextArea:文本区域
    MenuBar:菜单栏
    FileMenu:文件菜单
    EditMenu:编辑菜单
    HelpMenu:帮助菜单
    ScrollBat:滚动条
    '''
    Width = 300
    Height = 300
    TextArea = Text(root)
    MenuBar = Menu(root)
    FileMenu = Menu(MenuBar, tearoff=0)
    EditMenu = Menu(MenuBar, tearoff=0)
    HelpMenu = Menu(MenuBar, tearoff=0)
    ScrollBar = Scrollbar(TextArea)
    file = None

    def __init__(self, **kwargs):

        # 设置文本框的大小

        try:
            self.Width = kwargs['width']
        except KeyError:
            pass

        try:
            self.Height = kwargs['height']
        except KeyError:
            pass

        # 设置窗口标题
        self.root.title("Python记事本")

        # 将窗口居中显示
        screenWidth = self.root.winfo_screenwidth()
        screenHeight = self.root.winfo_screenheight()
        left = (screenWidth / 2) - (self.Width / 2)
        top = (screenHeight / 2) - (self.Height / 2)
        self.root.geometry('%dx%d+%d+%d' %
                           (self.Width, self.Height, left, top))

        # 文本区域大小调整
        self.root.grid_rowconfigure(0, weight=1)
        self.root.grid_columnconfigure(0, weight=1)

        # Add controls (widget)
        self.TextArea.grid(sticky=N + E + S + W)

        # 增加新建配置
        self.FileMenu.add_command(label="新建", command=self.__newFile)

        # 增加打开配置
        self.FileMenu.add_command(label="打开", command=self.__openFile)

        # 增加保存配置
        self.FileMenu.add_command(label="保存", command=self.__saveFile)

        # 增加退出配置
        self.FileMenu.add_separator()
        self.FileMenu.add_command(label="退出", command=self.__quitApplication)
        # 菜单中设置文件按钮
        self.MenuBar.add_cascade(label="文件", menu=self.FileMenu)

        # 增加剪切功能
        self.EditMenu.add_command(label="剪切", command=self.__cut)

        # 增加复制功能
        self.EditMenu.add_command(label="复制", command=self.__copy)

        # 增加粘贴功能
        self.EditMenu.add_command(label="粘贴", command=self.__paste)

        # 菜单中设置编辑按钮
        self.MenuBar.add_cascade(label="编辑", menu=self.EditMenu)

        # 增加关于记事本选项
        self.HelpMenu.add_command(label="关于记事本", command=self.__showAbout)
        # 菜单中射者帮助按钮
        self.MenuBar.add_cascade(label="帮助", menu=self.HelpMenu)

        self.root.config(menu=self.MenuBar)

        self.ScrollBar.pack(side=RIGHT, fill=Y)

        # 滚动条根据内容进行调整
        self.ScrollBar.config(command=self.TextArea.yview)
        self.TextArea.config(yscrollcommand=self.ScrollBar.set)

    def __quitApplication(self):
        '''
        用于退出程序(关了就消失)
        '''

        self.root.destroy()

    def __showAbout(self):
        '''
        添加帮助菜单中的信息
        '''

        showinfo("关于记事本", "来自:二哥不像程序员")

    def __openFile(self):
        '''
        打开文件
        '''

        self.file = askopenfilename(defaultextension=".txt",
                                    filetypes=[("All Files", "*.*"),
                                               ("Text Documents", "*.txt")])

        if self.file == "":
            self.file = None
        else:

            self.root.title(os.path.basename(self.file))
            self.TextArea.delete(1.0, END)
            file = open(self.file, "r")
            self.TextArea.insert(1.0, file.read())
            file.close()

    def __newFile(self):
        '''
        新文件:默认是一个未命名文件
        '''

        self.root.title("未命名文件")
        self.file = None
        self.TextArea.delete(1.0, END)

    def __saveFile(self):
        '''
        用于保存文件,不存在的文件进行新建,存在的文件在原文件基础上覆盖保存
        '''

        if self.file == None:
            self.file = asksaveasfilename(initialfile='Untitled.txt',
                                          defaultextension=".txt",
                                          filetypes=[("All Files", "*.*"),
                                                     ("Text Documents",
                                                      "*.txt")])

            if self.file == "":
                self.file = None
            else:

                file = open(self.file, "w")
                file.write(self.TextArea.get(1.0, END))
                file.close()

                # 更改title名字为文件名
                self.root.title(os.path.basename(self.file))

        else:
            file = open(self.file, "w")
            file.write(self.TextArea.get(1.0, END))
            file.close()

    # 添加功能项
    def __cut(self):
        self.TextArea.event_generate("<<Cut>>")

    def __copy(self):
        self.TextArea.event_generate("<<Copy>>")

    def __paste(self):
        self.TextArea.event_generate("<<Paste>>")

    def run(self):
        # 使用mainloop()使得窗口一直存在
        self.root.mainloop()


notepad = Notepad(width=600, height=400)
notepad.run()

三、展示

在这里插入图片描述

菜单栏根据不同的系统会有不同的位置展示,mac嵌入在左上角,win在窗口内部进行嵌入。
相关文章
|
3月前
|
缓存 监控 供应链
唯品会自定义 API 自定义操作深度分析及 Python 实现
唯品会开放平台提供丰富API,支持商品查询、订单管理、促销活动等电商全流程操作。基于OAuth 2.0认证机制,具备安全稳定的特点。通过组合调用基础接口,可实现数据聚合、流程自动化、监控预警及跨平台集成,广泛应用于供应链管理、数据分析和智能采购等领域。结合Python实现方案,可高效完成商品搜索、订单分析、库存监控等功能,提升电商运营效率。
|
3月前
|
缓存 监控 供应链
京东自定义 API 操作深度分析及 Python 实现
京东开放平台提供丰富API接口,支持商品、订单、库存等电商全链路场景。通过自定义API组合调用,可实现店铺管理、数据分析、竞品监控等功能,提升运营效率。本文详解其架构、Python实现与应用策略。
缓存 监控 供应链
74 0
缓存 监控 数据挖掘
68 0
|
9月前
|
缓存 Shell 开发工具
[oeasy]python071_我可以自己做一个模块吗_自定义模块_引入模块_import_diy
本文介绍了 Python 中模块的导入与自定义模块的创建。首先,我们回忆了模块的概念,即封装好功能的部件,并通过导入 `__hello__` 模块实现了输出 &quot;hello world!&quot; 的功能。接着,尝试创建并编辑自己的模块 `my_file.py`,引入 `time` 模块以获取当前时间,并在其中添加自定义输出。
170 5
|
10月前
|
人工智能 自然语言处理 程序员
体验通义灵码的AI程序员:用Python+Tkinter实现表单向config.ini写入与读取
本文介绍了如何利用通义灵码的AI程序员快速开发一个基于Python和Tkinter的表单应用程序,实现对config.ini文件的读写。通过简单的自然语言描述,通义灵码能自动生成代码框架、自动补全功能代码,并提供错误检测与修复建议,极大提高了开发效率。开发者只需安装必要库(如configparser)并配置VSCode插件TONGYI Lingma,即可轻松创建包含多个输入项和按钮的表单界面。运行程序后,用户可以编辑表单并保存数据到config.ini文件中,再次启动时数据会自动加载显示。这一过程展示了AI在编程中的高效性和灵活性,为开发者提供了全新的开发方式。
408 3
|
11月前
|
数据挖掘 数据处理 开发者
Python3 自定义排序详解:方法与示例
Python的排序功能强大且灵活,主要通过`sorted()`函数和列表的`sort()`方法实现。两者均支持`key`参数自定义排序规则。本文详细介绍了基础排序、按字符串长度或元组元素排序、降序排序、多条件排序及使用`lambda`表达式和`functools.cmp_to_key`进行复杂排序。通过示例展示了如何对简单数据类型、字典、类对象及复杂数据结构(如列车信息)进行排序。掌握这些技巧可以显著提升数据处理能力,为编程提供更强大的支持。
518 10
|
Python
在Python中,自定义函数可以抛出自定义异常
在Python中,自定义函数可以抛出自定义异常
249 5
|
存储 开发者 Python
自定义Python的异常
自定义Python的异常
208 5
|
存储 JSON API
如何自定义Python环境变量?
如何自定义Python环境变量?
398 3