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 相关文章推荐
Windows下python2.7.8安装图文教程
May 26 Python
Django项目实战之用户头像上传与访问的示例
Apr 21 Python
win7 x64系统中安装Scrapy的方法
Nov 18 Python
python 实现数字字符串左侧补零的方法
Dec 04 Python
python调用外部程序的实操步骤
Mar 04 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
Sep 18 Python
python 动态调用函数实例解析
Oct 21 Python
python 求定积分和不定积分示例
Nov 20 Python
Python基础之字典常见操作经典实例详解
Feb 26 Python
Python自带的IDE在哪里
Jul 01 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
Sep 01 Python
Python判断字符串是否为合法标示符操作
Sep 03 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执行速度全攻略(上)
2006/10/09 PHP
phpMyadmin 用户权限中英对照
2010/04/02 PHP
php给一组指定关键词添加span标签的方法
2015/03/31 PHP
Yii框架的redis命令使用方法简单示例
2019/10/15 PHP
php的对象传值与引用传值代码实例讲解
2021/02/26 PHP
JavaScript高级程序设计 错误处理与调试学习笔记
2011/09/10 Javascript
form表单只提交数据而不进行页面跳转的解决方案
2013/09/18 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
canvas 绘制圆形时钟
2017/02/22 Javascript
很棒的vue弹窗组件
2017/05/24 Javascript
Vue-resource拦截器判断token失效跳转的实例
2017/10/27 Javascript
浅谈Vue数据绑定的原理
2018/01/08 Javascript
js中的闭包学习心得
2018/02/06 Javascript
基于node搭建服务器,写接口,调接口,跨域的实例
2018/05/13 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
2019/05/23 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
vue(2.x,3.0)配置跨域代理
2019/11/27 Javascript
基于vue+element实现全局loading过程详解
2020/07/10 Javascript
在vue-cli3.0 中使用预处理器 (Sass/Less/Stylus) 配置全局变量操作
2020/08/10 Javascript
python基础教程之五种数据类型详解
2017/01/12 Python
Python实现文件内容批量追加的方法示例
2017/08/29 Python
Sanic框架Cookies操作示例
2018/07/17 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
2020/02/07 Python
用Python做一个久坐提醒小助手的示例代码
2020/02/10 Python
python实现超级玛丽游戏
2020/03/18 Python
python argparse传入布尔参数false不生效的解决
2020/04/20 Python
keras小技巧——获取某一个网络层的输出方式
2020/05/23 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
CSS3制作文字半透明倒影效果的两种实现方式
2014/08/08 HTML / CSS
为什么会有内存对齐
2016/10/10 面试题
介绍一下Ruby的多线程处理
2013/02/01 面试题
护理自荐信
2013/10/22 职场文书
优秀学生评语大全
2014/04/25 职场文书
国庆庆典邀请函
2015/02/02 职场文书
2015年宣传思想工作总结
2015/05/22 职场文书
Mysql 一主多从的部署
2022/05/20 MySQL