python 记事本1.0

演示

在这里插入图片描述
当在文本框中输入内容时,在文件名前面会显示星号
在这里插入图片描述
打开文件
在这里插入图片描述
在这里插入图片描述
还有保存文件、另存为文件功能

代码

import ttkbootstrap as ttk 
from ttkbootstrap.constants import *
# tkinter 内的组件
from tkinter.filedialog import askopenfilename
from tkinter.filedialog import asksaveasfilename
from tkinter.messagebox import *
from tkinter.scrolledtext import ScrolledText

# 文件类型
file_types = (("txt 文本","*.txt"),("java 文件","*.java"),("c 文件","*.c"),
    ("c++ 文件","*.cpp"),("python 文件","*.py"),("所有文件","*.*"),)

# 记事本应用程序
class Application(ttk.Frame):
    def __init__(self,master=None):
        super().__init__(master, padding=15)
        self.master = master                           #  框架基于根容器
        self.textarea = None                           #  textarea文本区域
        self.filepath = ""                             #  记事本保存的文件路径
        self.filename = "无标题"                        #  文件名
        self.unchange_file = ""                        #  保存未修改的文件(记录当时打开的文件)
        self.pack()                                    #  放置应用程序
        self.createWidget()                            #  记事本中各个组件在这里创建  

    def createWidget(self):

        # 全局变量
        global root

        # 创建主菜单栏
        menubar = ttk.Menu(root)
        '''创建一个弹出菜单'''
        menuPop = ttk.Menu(root,tearoff=False)

        #创建子菜单
        menuFlie = ttk.Menu(menubar)
        menuEdit = ttk.Menu(menubar)
        menuHelp = ttk.Menu(menubar)

        # 将子菜单加入到主菜单栏
        menubar.add_cascade(label='文件(F)',menu=menuFlie)
        menubar.add_cascade(label='编辑(E)',menu=menuEdit)
        menubar.add_cascade(label='帮助(H)',menu=menuHelp)

        # 添加菜单项
        menuFlie.add_command(label='打开',accelerator='Ctrl+O',command=self.open_file)
        menuFlie.add_command(label='保存',accelerator='Ctrl+S',command=self.save_file)
        menuFlie.add_command(label='另存为',accelerator='Ctrl+W',command=self.saveas_file)
        menuFlie.add_separator()        #添加分割线
        menuFlie.add_command(label='退出',accelerator='Ctrl+Q',command=self.exit)

        menuPop.add_command(label="剪切", command=self.cut_text)
        menuPop.add_command(label="复制", command=self.copy_text)
        menuPop.add_command(label="粘贴", command=self.paste_text)
        menuPop.add_command(label="全选", command=self.select_all)
        menuPop.add_command(label="清空", command=self.clear_text)


        #将主菜单栏加到根窗口
        root.config(menu=menubar)
        
        style = ttk.Style()
        #文本编辑区
        self.textarea = ttk.ScrolledText(root,
            highlightcolor=style.colors.primary,
            highlightbackground=style.colors.border,
            highlightthickness=1)

        self.textarea.pack(fill=BOTH,expand=True)

        #增加快捷键的处理
        root.bind('<Control-o>',lambda event:self.open_file())
        root.bind('<Control-s>',lambda event:self.save_file())
        root.bind('<Control-w>',lambda event:self.save_file())
        root.bind('<Control-a>',lambda event:self.select_all())
        root.bind('<Control-d>',lambda event:self.clear_text())
        root.bind('<Control-q>',lambda event:self.exit())
        
        root.bind('<Key>',lambda event:self.changed_file()) # 检查文件是否修改

        self.textarea.bind("<Button-3>",lambda event:self.popup(menuPop=menuPop,event=event)) # 绑定鼠标右键,执行popup函数

        

    def cut_text(self,event=None):
        self.textarea.event_generate('<<Cut>>')
    
    def copy_text(self,event=None):
        self.textarea.event_generate('<<Copy>>')
        
    def paste_text(self,event=None):
        self.textarea.event_generate('<<Paste>>')

    def select_all(self,event=None):
        self.textarea.tag_add('sel', '1.0', 'end')

    def clear_text(self,event=None):
        global root 
        self.textarea.delete("1.0",END)

        if self.filename[0] == "*":
            self.filename = self.filename[1:]
            root.title(self.filename + "-记事本")

    def popup(self,menuPop,event):
        menuPop.post(event.x_root, event.y_root)

    # 打开文件选择对话框
    def open_file(self):

        global root

        self.filepath = askopenfilename(filetypes=file_types)

        if self.filepath != "":
           
            try:

                with open(self.filepath,"r",encoding="utf-8") as file:
                    # 清空文本域
                    self.textarea.delete("1.0",END)
                    # 将文件内容添加进来
                    msg = file.read()
                    self.textarea.insert(END,msg)
                    # 记录打开的文件
                    self.unchange_file = msg.strip()

                    o_index = self.filepath.rfind("/") + 1
                    self.filename = self.filepath[o_index:]
                    root.title(self.filename + "-记事本")

            except PermissionError as e:
                    # 清空文本域
                    self.textarea.delete("1.0",END)
                    # 弹出窗口
                    showerror(title='错误', message='权限不足,无法打开该文件!')

            except UnicodeDecodeError as e1:
                    self.textarea.delete("1.0",END)
                    showerror(title='错误', message='文件格式错误,无法打开该文件!')

            except Exception as e2:
                    self.textarea.delete("1.0",END)
                    showerror(title='错误', message='无法打开该文件!')


    # 保存文件
    def save_file(self,exit_program=False):
        global root

        # 判断是否是新文件(file_name为空)
        if "无标题" not in self.filename:
            
            if self.filename[0] == "*":

                save_msg = self.textarea.get("1.0",END)

                with open(self.filepath,"w",encoding="utf-8") as file:
                    file.write(save_msg)
                    # 更新保存后的文件
                    self.unchange_file = save_msg.strip()
                    # 去除*
                    self.filename = self.filename[1:]
                    root.title(self.filename + "-记事本")
        else:
            # 新文件--> 另存为
            self.saveas_file()

    # 另存为文件
    def saveas_file(self):

        global root

        self.filepath = asksaveasfilename(defaultextension=".txt", initialfile="未命名.txt",filetypes=file_types)
        s_index = self.filepath.rfind("/") + 1

        if self.filepath != "":
            # 存在文件路径
            with open(self.filepath,"w",encoding="utf-8") as file:
                file.write(self.textarea.get("1.0",END))
            self.filename = self.filepath[s_index:] # 文件名记录
        else:
            self.filename == "无标题"

                 
        root.title(self.filename + "-记事本")

    # 判断文件是否修改过
    def changed_file(self) -> bool:
        global root

        # 从文本区域中获取文本
        change_file = self.textarea.get("1.0",END).strip()

        if change_file == "" and (self.unchange_file == change_file or "无标题" in self.filename) and self.filename[0] == "*": 
             # 去除*
            self.filename = self.filename[1:]
            root.title(self.filename + "-记事本")

        if self.textarea == None:
            return False

        if self.filename[0] == "*":
            return True  # 文件还没有保存

        
        
        if self.unchange_file != change_file:
            # 文件已经重新写入了内容
            self.filename = "*" + self.filename 
            root.title(self.filename + "-记事本")
            return True
        return False
    

    # 退出程序
    def exit(self):
        global root

        # 在退出之间,查看是否修改了文件
        if self.filename[0] == "*":
            if askokcancel("退出","文件尚未保存,是否进行保存"): 
                self.save_file()
        
        root.destroy()
                

if __name__ == '__main__':
    root = ttk.Window("无标题-记事本")
    root.geometry('900x600')

    app = Application(master=root)
    app.mainloop()


版本预告

ttkbootstrap 第三方库 添加进去,美化页面
该程序大部分都只是tkinter大的内容

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fy哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值