tkinter实现记事本(完整代码)

文章目录

环境

1.电脑环境
编译器:PyCharm 2021.2.1
解释器:Anaconda 3.8
2.库
tkinter、os 标准库不需要安装

完整代码

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


class txt(tk.Tk):
    def __init__(self):
        super(txt, self).__init__()

        self.geometry('600x450+300+200')
        self.title('记事本 1.0')
        self.main()

    def main(self):

        # 保存 新建 退出
        self.menu1 = tk.Menu(self)
        self.menu1.add_command(label='保存', command=lambda: self.save('e'))
        self.menu1.add_command(label='新建', command=txt)
        self.menu1.add_command(label='打开', command=self.open_file)
        self.config(menu=self.menu1)

        # 鼠标右键菜单
        self.menu2 = tk.Menu(self, tearoff=False)
        self.menu2.add_command(label='复制', command=self.copy)
        self.menu2.add_command(label='剪切', command=self.cut)
        self.menu2.add_command(label='粘贴', command=self.paste)

        # 滚动条
        scr = tk.Scrollbar(self)

        # 多行输入
        # undo 开启恢复和撤销操作
        # autoseparators 完整的操作结束后自动插入分隔符 不开启
        self.text = tk.Text(self, yscrollcommand=scr.set, undo=True, autoseparators=False)
        # self.text.insert(tk.END, 'iadsfaf')
        # print(self.text.get(1.0, tk.END))
        self.text.pack(side='left', fill='both', expand='yes')
        scr.pack(side='left', fill='y')
        scr.config(command=self.text.yview)
        
        
        # 组合键 Ctr+s
        self.bind('<Control-s>', self.save)
        self.text.bind('<Key>', self.callback)
        self.text.bind('<Control-Z>', self.undo)
        self.text.bind('<Control-Y>', self.redo)
        self.text.bind('<Button-3>', self.pop1)
        # 关闭窗口触发事件
        self.protocol('WM_DELETE_WINDOW', self.dest)

    def dest(self):
        # print(self.text.get(1.0, tkinter.END))
        if self.text.get(1.0, tkinter.END).strip():
            n = 1
            flag = True
            file = os.getcwd()
            # os.listdir(file) 返回当前目录下的所有文件
            # print(os.listdir(file))
            # 避免重复文件名字
            while flag:
                for i in os.listdir(file):
                    # print(i)
                    if i == f'新建文本文档 ({
      
      n}).txt':
                        n += 1
                        # print(n)
                        break
                else:
                    flag = False
            v = tkinter.messagebox.askyesno(title='文件保存', message='将文件保存到' + file + '\\' + f'新建文本文档 ({
      
      n}).txt')
            if v:
                # 返回当前文件的绝对目录

                with open(file + '\\' + f'新建文本文档 ({
      
      n}).txt', mode='w', encoding='utf-8') as f:
                    f.write(self.text.get(1.0, tk.END))
                self.destroy()
            else:
                self.destroy()
        else:
            self.destroy()

    # 撤销
    def undo(self, event):
        self.text.edit_undo()

    # 反撤销
    def redo(self, event):
        self.text.edit_redo()

    # 添加分割线 不会撤销所有
    def callback(self, event):
        self.text.edit_separator()

    # 保存文件
    def save(self, event):

        filetype = [('Text Files', '*.txt')]
        ask = asksaveasfilename(defaultextension='.txt', filetypes=filetype, initialfile='test', title='保存文件')
        # print(ask) # 返回文件路径
        # print(os.path.basename(ask)) 返回文件名

        if ask:
            with open(ask, mode='w', encoding='utf-8') as f:
                f.write(self.text.get(1.0, tk.END))
            tk.messagebox.showinfo('消息', '保存成功')

    # 读取txt文件内容
    def open_file(self):
        filetype = [('Text Files', '*.txt')]
        op = askopenfilename(defaultextension='.txt', filetypes=filetype, title='保存文件')
        if op:
            # 清空原有文件内容
            self.text.delete(1.0, tk.END)
            with open(op, mode='r', encoding='utf-8') as f:
                data = f.read()
                self.text.insert(tk.END, data)

    # 菜单出现位置
    def pop1(self, event):
        # 鼠标位置
        # print(event.x_root, event.y_root)
        self.menu2.post(event.x_root, event.y_root)

    # 复制
    def copy(self):
        try:
            # 清除剪切板
            self.text.clipboard_clear()
            # 标记第一个位置到最后一个位置
            copyText = self.text.get(tk.SEL_FIRST, tk.SEL_LAST)
            # 添加到剪切板
            self.text.clipboard_append(copyText)
        except:
            pass

    # 删除 + 复制 = 剪切
    def cut(self):
        try:
            self.copy()
            self.text.delete(tk.SEL_FIRST, tk.SEL_LAST)  # 删除选取文字
        except:
            pass

    # 粘贴
    def paste(self):
        try:
            # 读取剪切板的内容
            copyText = self.text.selection_get(selection="CLIPBOARD")
            # INSERT 光标处插入
            self.text.insert(INSERT, copyText)
        except:
            pass


if __name__ == '__main__':
    txt().mainloop()

结尾

本人小白,写文章纯粹为了学习,若文章有错误,望各位指正,谢谢大家!

猜你喜欢

转载自blog.csdn.net/qq_65898266/article/details/128308681