Python用tkinter实现自定义记事本的方法详解


Posted in Python onMarch 31, 2022

一、思考

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

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

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

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

二、代码实现

创建记事本窗口

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

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()

三、展示

Python用tkinter实现自定义记事本的方法详解

菜单栏根据不同的系统会有不同的位置展示,mac嵌入在左上角,win在窗口内部进行嵌入。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注三水点靠木的更多内容!

 

Python 相关文章推荐
Python常用正则表达式符号浅析
Aug 13 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
Jan 20 Python
Python动态生成多维数组的方法示例
Aug 09 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
Dec 02 Python
Python3获取拉勾网招聘信息的方法实例
Apr 03 Python
Python学习笔记之Django创建第一个数据库模型的方法
Aug 07 Python
redis数据库及与python交互用法简单示例
Nov 01 Python
Django框架模板用法入门教程
Nov 04 Python
django有外键关系的两张表如何相互查找
Feb 10 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
Mar 06 Python
python获取响应某个字段值的3种实现方法
Apr 30 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
Feb 20 Python
Python利用zhdate模块实现农历日期处理
Mar 31 #Python
详解Python中__new__方法的作用
Mar 31 #Python
利用Python将list列表写入文件并读取的方法汇总
Mar 25 #Python
利用Python多线程实现图片下载器
Python实现灰色关联分析与结果可视化的详细代码
聊聊基于pytorch实现Resnet对本地数据集的训练问题
pycharm安装深度学习pytorch的d2l包失败问题解决
You might like
修改了一个很不错的php验证码(支持中文)
2007/02/14 PHP
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
基于php设计模式中工厂模式详细介绍
2013/05/15 PHP
改写ThinkPHP的U方法使其路由下分页正常
2014/07/02 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
php获取指定数量随机字符串的方法
2017/02/06 PHP
PHP基于mcript扩展实现对称加密功能示例
2019/02/21 PHP
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
jQuery中:radio选择器用法实例
2015/01/03 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
微信小程序前端源码逻辑和工作流
2016/09/25 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
2016/11/21 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
vue中改变选中当前项的显示隐藏或者状态的实现方法
2018/02/08 Javascript
基于Vue实现拖拽效果
2018/04/27 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
详解VS Code使用之Vue工程配置format代码格式化
2019/03/20 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
Python打印斐波拉契数列实例
2015/07/07 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
2017/12/14 Python
python命令行工具Click快速掌握
2019/07/04 Python
pybind11在Windows下的使用教程
2019/07/04 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
金宝贝童装官网:Gymboree
2016/08/31 全球购物
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
物流创业计划书
2014/02/01 职场文书
中药学专业求职信
2014/05/31 职场文书
焦裕禄精神心得体会
2014/09/02 职场文书
python中urllib包的网络请求教程
2022/04/19 Python
postgresql如何找到表中重复数据的行并删除
2023/05/08 MySQL