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爬虫之使用Scrapy框架编写爬虫
Nov 07 Python
Python 迭代器工具包【推荐】
May 06 Python
Python使用functools模块中的partial函数生成偏函数
Jul 02 Python
Python排序算法之选择排序定义与用法示例
Apr 29 Python
Python hexstring-list-str之间的转换方法
Jun 12 Python
pandas 使用均值填充缺失值列的小技巧分享
Jul 04 Python
python实现基于朴素贝叶斯的垃圾分类算法
Jul 09 Python
python实现动态数组的示例代码
Jul 15 Python
将matplotlib绘图嵌入pyqt的方法示例
Jan 08 Python
python 按钮点击关闭窗口的实现
Mar 04 Python
Jupyter打开图形界面并画出正弦函数图像实例
Apr 24 Python
Python语言内置数据类型
Feb 24 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与paypal整合方法
2010/11/28 PHP
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
PHP 基于Yii框架中使用smarty模板的方法详解
2013/06/13 PHP
php 生成短网址原理及代码
2014/01/23 PHP
php的XML文件解释类应用实例
2014/09/22 PHP
php三元运算符知识汇总
2015/07/02 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
详解php用static方法的原因
2018/09/12 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
浅谈php使用curl模拟多线程发送请求
2019/03/08 PHP
RR vs IO BO3 第二场2.13
2021/03/10 DOTA
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
jQuery实现 注册时选择阅读条款 左右移动
2013/04/11 Javascript
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
angularjs基础教程
2014/12/25 Javascript
关于延迟加载JavaScript
2015/05/05 Javascript
jQuery在header中设置请求信息的方法
2017/03/06 Javascript
js模拟支付宝密码输入框
2017/04/11 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
vue+webpack实现异步加载三种用法示例详解
2018/04/24 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
NumPy排序的实现
2020/01/21 Python
matlab、python中矩阵的互相导入导出方式
2020/06/01 Python
简述python&amp;pytorch 随机种子的实现
2020/10/07 Python
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
超市总经理岗位职责
2014/02/02 职场文书
医德医风演讲稿
2014/05/20 职场文书
机票销售员态度不好检讨书
2014/09/27 职场文书
小学校园广播稿集锦
2014/10/04 职场文书
新生入学欢迎词
2015/01/26 职场文书
推销搭讪开场白
2015/05/28 职场文书
指导教师推荐意见
2015/06/05 职场文书
Python包argparse模块常用方法
2021/06/04 Python