플그래밍/파이써언

[파이썬] 간단한 텍스트 에디터 (열기, 조회, 수정, 저장)

훗티v 2023. 2. 10. 05:47
반응형

✏️ [파이썬] 간단한 텍스트 에디터 (열기, 조회, 수정, 저장)

 

ChatGPT를 참고하여 만든 Tkinter 텍스트 에디터 입니다.

 

▫️ 텍스트 파일 열기
▫️ 수정 사항 발생 시 타이틀바에 알림
▫️ 저장
▫️ 종료 전 수정 사항 저장 여부 확인

 

 

📦 파이썬 코드

import tkinter as tk
from tkinter import filedialog

class TextEditor:
    def __init__(self, master):
        self.master = master
        self.master.title("텍스트 편집기")

        self.text = tk.Text(self.master, wrap='word')
        self.text.pack(fill='both', expand=True)

        self.changed = False
        self.filename = None

        self.text.bind('<KeyRelease>', self.track_changes)

        menu = tk.Menu(self.master)
        self.master.config(menu=menu)

        file_menu = tk.Menu(menu, tearoff=False)
        menu.add_cascade(label='파일', menu=file_menu)
        file_menu.add_command(label='열기', command=self.open_file)
        file_menu.add_command(label='저장', command=self.save_file)
        file_menu.add_separator()
        file_menu.add_command(label='종료', command=self.quit)

    def track_changes(self, event=None):
        self.changed = True
        self.master.title(f'텍스트 편집기 - 수정 사항 저장 안됨')

    def open_file(self):
        if self.changed:
            answer = tk.messagebox.askyesnocancel(
                '수정 사항 저장 안됨',
                '수정 사항을 저장하실껀가요?'
            )

            if answer == True:
                self.save_file()
            elif answer == None:
                return

        self.filename = filedialog.askopenfilename(
            defaultextension='.txt',
            filetypes=[('Text Files', '*.txt'), ('All Files', '*.*')]
        )

        if self.filename:
            with open(self.filename, 'r', encoding="utf-8") as file:
                self.text.delete('1.0', 'end')
                self.text.insert('1.0', file.read())

            filename_only = self.filename[self.filename.rfind("/")+1:]
            self.master.title(f'텍스트 편집기 - {filename_only}')
            self.changed = False

    def save_file(self):
        if not self.filename:
            self.filename = filedialog.asksaveasfilename(
                defaultextension='.txt',
                filetypes=[('Text Files', '*.txt'), ('All Files', '*.*')]
            )

        if self.filename:
            with open(self.filename, 'w', encoding="utf-8") as file:
                file.write(self.text.get('1.0', 'end'))

            filename_only = self.filename[self.filename.rfind("/")+1:]
            self.master.title(f'텍스트 편집기 - {filename_only}')
            self.changed = False
    
    def quit(self):
        if self.changed:
            answer = tk.messagebox.askyesnocancel(
                '수정 사항 저장 안됨',
                '수정 사항을 저장하실껀가요?'
            )

            if answer == True:
                self.save_file()
            elif answer == None:
                return

        self.master.destroy()

if __name__ == '__main__':
    root = tk.Tk()
    app = TextEditor(root)
    root.mainloop()

 

 

 

 

 

 

반응형