猫史档案馆


自制记事本

用户:tq_xyytq_xyy查看:0 回复:0 评论:0 创建时间:2020-11-29T15:14:36


from pathlib import Path
import tkinter
from tkinter import filedialog
from tkinter import ttk
from tkinter import scrolledtext

__all__ = ['TextBox', 'NotepadMain']

class TextBox(tkinter.Toplevel):
    def __init__(self, master=None, text='', title='信息盒子', width=52, height=18):
        self.text = text
        self.width = width
        self.height = height
        self.master = master
        super().__init__(self.master)
        self.title(title)
        self._textbox()
        self.withdraw()
        self.update()
    
    def _textbox(self):
        self._text = scrolledtext.ScrolledText(self, width=self.width, height=self.height, font=('', 12))
        self._text.insert(1.0, self.text)
        self._text.pack()
    
    def show(self):
        self.deiconify()
        self.mainloop()

class NotepadMain(tkinter.Frame):
    def __init__(self, master=None, filename=None):
        if master is None:
            master = tkinter._default_root
        self.master = master
        self.plugin = []
        self.file = None
        super().__init__(master)
        self.master.title('记事本')
        self.menu()
        self.textbox()
        if filename is not None:
            self.file = Path(filename)
            with open(filename, 'r') as f:
                data = f.read()
            self.loads(data)

    def loads(self, data):
        self.text.delete(1.0, 'end')
        self.text.insert(1.0, data)

    def gets(self):
        data = self.text.get(1.0, 'end')
        return data

    def save(self):
        if self.file is None:
            return self.saveas()
        with open(self.file, 'w') as f:
            f.write(self.gets())

    def saveas(self):
        path = filedialog.asksaveasfilename(title='保存', filetypes=[("所有文件", "*.*")])
        if not path:
            return
        self.file = Path(path)
        with open(path, 'w') as f:
            f.write(self.gets())

    def open(self):
        path = filedialog.askopenfilename(title='打开')
        if not path:
            return
        self.file = Path(path)
        with open(path, 'r') as f:
            data = f.read()
        self.loads(data)

    def menu(self):
        self.mainmenu = tkinter.Menu(self)
        self.childmenu = tkinter.Menu(self.mainmenu, tearoff=False)
        self.mainmenu.add_cascade(label='菜单', menu=self.childmenu)
        self.childmenu.add_command(label='打开', command=self.open)
        self.childmenu.add_command(label='保存', command=self.save)
        self.childmenu.add_command(label='另存为', command=self.saveas)
        self.childmenu.add_separator()
        self.childmenu.add_command(label='退出', command=self.master.quit)
        self.master.config(menu=self.mainmenu)

    def textbox(self):
        self.text = tkinter.Text(self, font=('', 12))
        self.text.pack(side="left", fill="both")
        self.scroll = ttk.Scrollbar(self, command=self.text.yview)
        self.scroll.pack(side="right", fill="y")
        self.text.config(yscrollcommand=self.scroll.set)

    def mainloop(self):
        for function in self.plugin:
            function(self)
        self.pack()
        self.master.mainloop()
    
    def register(self, function):
        self.plugin.append(function)
        return function

if __name__ == "__main__":
    NotepadMain().mainloop()
    # root = tkinter.Tk()
    # notepad = NotepadMain(root, filename='hhh.txt')
    
    # @notepad.register
    # def showbox(self):
    #     def showtext():
    #         box = TextBox(root, '成功')
    #         box.show()
    #     btn = tkinter.Menu(self.mainmenu, tearoff=False)
    #     self.mainmenu.add_cascade(label='显示信息', menu=btn)
    #     btn.add_command(label='成功', command=showtext)
    #     self.master.config(menu=self.mainmenu)

    # notepad.mainloop()


回复

上一页1 页 / 共 0下一页