22  텍스트 에디터 (Text Editor)

텍스트 파일을 열고, 읽고, 쓸 수 있는 간단한 텍스트 에디터를 만들어 봅시다. 보너스 점수를 위해 찾기 도구(Find Tool)와 정규식(Regex)을 활용한 검색 및 바꾸기 기능까지 포함해 보세요.

이 프로젝트는 파일 시스템의 입출력(I/O)과 문자열 조작, 그리고 사용자의 편집 내용을 실시간으로 관리하는 방법을 익히기에 아주 좋은 과제입니다. 특히 최근 개발용 에디터에 필수적인 문법 강조(Syntax Highlighting) 기능을 직접 설계해 보세요.

22.1 주요 개발 포인트

  • 파일 열기/저장 기능 (I/O): open(), read(), write()를 활용하여 로컬 파일을 안전하게 읽고 저장합니다.
  • 텍스트 편집 및 버퍼 관리: 사용자가 입력한 내용을 메모리에 보관하고 커서 위치를 추적합니다.
  • 찾기 및 바꾸기 (Regex Search): 정규 표현식을 사용하여 문서 내의 특정 패턴을 빠르게 찾아내고 일괄 변경합니다.
  • 실시간 문법 강조 (Syntax Highlighting): 특정 키워드(예: if, else, def)를 다른 색상으로 표시하여 가독성을 높입니다.
  • 사용자 인터페이스 (GUI): 메뉴 바(File, Edit, Help), 스크롤 바, 줄 번호(Line Numbers)를 포함한 깔끔한 UI를 구축합니다.

22.2 Python 구현 예시 (Tkinter 활용 간단한 에디터 시뮬레이션)

import tkinter as tk
from tkinter import filedialog, messagebox

class SimpleEditor:
    """
    텍스트 파일을 편집하고 관리하는 기능을 제공합니다.
    """
    def __init__(self, root):
        self.root = root
        self.root.title("나만의 Python 텍스트 에디터")
        
        # 텍스트 위젯 설정
        self.text_area = tk.Text(self.root, wrap="word", undo=True)
        self.text_area.pack(expand=True, fill="both")
        
        # 메뉴 설정
        self.menu_bar = tk.Menu(self.root)
        self.root.config(menu=self.menu_bar)
        
        file_menu = tk.Menu(self.menu_bar, tearoff=0)
        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.root.quit)
        self.menu_bar.add_cascade(label="파일", menu=file_menu)

    def open_file(self):
        """
        파일 탐색기를 열어 텍스트 파일을 불러옵/니다.
        """
        file_path = filedialog.askopenfilename(defaultextension=".txt", 
                                               filetypes=[("Text Documents", "*.txt"), ("All Files", "*.*")])
        if file_path:
            with open(file_path, "r", encoding="utf-8") as f:
                content = f.read()
                self.text_area.delete(1.0, tk.END)
                self.text_area.insert(tk.END, content)
            print(f"'{file_path}' 파일을 열었습니다.")

    def save_file(self):
        """
        현재 편집 중인 내용을 파일로 저장합니다.
        """
        file_path = filedialog.asksaveasfilename(defaultextension=".txt", 
                                                 filetypes=[("Text Documents", "*.txt"), ("All Files", "*.*")])
        if file_path:
            content = self.text_area.get(1.0, tk.END)
            with open(file_path, "w", encoding="utf-8") as f:
                f.write(content)
            messagebox.showinfo("저장 완료", f"'{file_path}'에 저장되었습니다.")

if __name__ == "__main__":
    # Tkinter 설치 시 실행 가능
    # root = tk.Tk()
    # app = SimpleEditor(root)
    # root.mainloop()
    print("실제 에디터를 실행하려면 Tkinter 설치 후 위 함수를 호출하세요.")