발전을 위한 기록

[Python] 파이썬을 이용한 번역기 만들기 GUI 본문

프로그래밍/파이썬

[Python] 파이썬을 이용한 번역기 만들기 GUI

릴릴2 2024. 12. 29. 16:37
728x90

 


필요한 라이브러리

작성한 프로그램에서는 두 가지 주요 라이브러리를 사용합니다.

  • tkinter : GUI를 구현하기 위한 Python의 표준 라이브러리
  • googletrans : Google Translate API를 이용해 텍스트를 번역하는 라이브러리

 

📌tkinter라이브러리는 파이썬에 기본적으로 포함되어 있지만, googletrans는 별도 설치가 필요합니다.

아래 명령어로 설치할 수 있습니다.

pip install googletrans==4.0.0-rc1
 

전체 코드

from tkinter import Tk, Label, Text, Button, END, messagebox, StringVar
from tkinter.ttk import Combobox
from googletrans import Translator, LANGUAGES

# 번역기 생성
translator = Translator()

# LANGUAGES를 한국어로 번역 (직접 작성한 한국어 매핑)
LANGUAGE_KR_MAPPING = {
    "auto":"자동선택",
    "en": "영어",
    "ko": "한국어",
    "ja": "일본어",
    "fr": "프랑스어",
    "de": "독일어",
    "zh-cn": "중국어(간체)",
    "zh-tw": "중국어(번체)",
    "es": "스페인어",
    "ru": "러시아어",
    # 필요한 언어를 계속 추가
}

# LANGUAGE_KR_MAPPING 값:키 반전
LANGUAGE_NAMES_KR = {v: k for k, v in LANGUAGE_KR_MAPPING.items()}

def translate_text():
    try:
        # 원본 텍스트와 선택된 언어 가져오기
        source_text = text_input.get("1.0", END).strip()
        if not source_text:
            messagebox.showwarning("경고", "번역할 내용을 입력해주세요.")
            return
        
        # 사용자 선택 언어를 코드로 변환
        source_lang = LANGUAGE_NAMES_KR[source_lang_var.get()]
        target_lang = LANGUAGE_NAMES_KR[target_lang_var.get()]
        
        # 번역 실행
        translated = translator.translate(source_text, src=source_lang, dest=target_lang)
        text_output.delete("1.0", END)
        text_output.insert(END, translated.text)
    except Exception as e:
        messagebox.showerror("오류", f"번역 중 문제가 발생했습니다: {e}")

# GUI 설정
root = Tk()
root.title("번역기")
root.geometry("500x600")

# 언어 선택 옵션
language_list = list(LANGUAGE_KR_MAPPING.values())  # 한국어로 번역된 언어 목록

# 원본 언어 선택
Label(root, text="원본 언어 선택:").pack()
source_lang_var = StringVar()
source_lang_var.set("자동선택")  # 기본값: 자동선택
source_lang_combo = Combobox(root, textvariable=source_lang_var, values=["자동선택"] + language_list, state="readonly", height=5)
source_lang_combo.pack()

# 대상 언어 선택
Label(root, text="대상 언어 선택:").pack()
target_lang_var = StringVar()
target_lang_var.set("한국어")  # 기본값: 한국어
target_lang_combo = Combobox(root, textvariable=target_lang_var, values=language_list, state="readonly", height=5)
target_lang_combo.pack()

# 원본 텍스트 입력
Label(root, text="번역할 텍스트:").pack()
text_input = Text(root, height=10, width=50)
text_input.pack()

# 번역 결과 출력
Label(root, text="번역 결과:").pack()
text_output = Text(root, height=10, width=50)
text_output.pack()

# 번역 버튼
Button(root, text="번역하기", command=translate_text).pack()

root.mainloop()
 

코드 설명

1. 라이브러리 임포트💻

from tkinter import Tk, Label, Text, Button, END, messagebox, StringVar
from tkinter.ttk import Combobox
from googletrans import Translator, LANGUAGES
 
  • Tkinter : Tk, Label, Text, Button, END, massagebox, StrinVar는 GUI위젯을 구성하고 메시지를 표시하기 위한 클래스입니다.
  • Combobox : 드롭다운 메뉴를 만들 때 사용되는 위젯입니다.
  • googletrans : Translator 클래스는 텍스트를 번역하는 기능을 제공합니다.

 

 

2. 언어 매핑💻

LANGUAGE_KR_MAPPING = {
    "auto": "자동선택",
    "en": "영어",
    "ko": "한국어",
    "ja": "일본어",
    "fr": "프랑스어",
    "de": "독일어",
    "zh-cn": "중국어(간체)",
    "zh-tw": "중국어(번체)",
    "es": "스페인어",
    "ru": "러시아어",
}
 
  • google translate의 언어 코드는 영어 코드로 되어 있습니다.
  • 사용자에게 친숙한 한국어 이름을 표시하기 위해 한국어 이름을 매핑하는 딕셔너리를 만듭니다.

 

LANGUAGE_NAMES_KR = {v: k for k, v in LANGUAGE_KR_MAPPING.items()}
 
  • Google Translate에서는 영어 코드를 사용하기 때문에 선택된 언어의 이름을 다시 영어로 변환하는 반전 딕셔너리를 만듭니다.
  • en -> 영어 -> en

 

3. 번역 함수💻

def translate_text():
    try:
        # 원본 텍스트와 선택된 언어 가져오기
        source_text = text_input.get("1.0", END).strip()  # 텍스트 박스에서 입력값 가져오기
        if not source_text:
            messagebox.showwarning("경고", "번역할 내용을 입력해주세요.")
            return
        
        # 사용자 선택 언어를 코드로 변환
        source_lang = LANGUAGE_NAMES_KR[source_lang_var.get()]
        target_lang = LANGUAGE_NAMES_KR[target_lang_var.get()]
        
        # 번역 실행
        translated = translator.translate(source_text, src=source_lang, dest=target_lang)
        text_output.delete("1.0", END)  # 번역 결과를 출력 창에 지우기
        text_output.insert(END, translated.text)  # 번역된 텍스트 삽입
    except Exception as e:
        messagebox.showerror("오류", f"번역 중 문제가 발생했습니다: {e}")
 
  • 번역을 실제로 수행하는 함수입니다.
  • text_input.get("1.0", END)를 통해 입력한 텍스트를 가져옵니다. 여기서 "1.0"은 첫 번째 줄의 첫 번째 문자, "END"는 마지막 문자입니다.
  • LANGUAGE_NAMES_KR 딕셔너리를 이용해 사용자가 선택한 언어를 Google Translate에서 사용할 수 있는 코드로 변환합니다.
  • translator.translate 메서드를 호출하여 텍스트를 번역합니다.
  • text_output.delete로 기존 결과를 지우고, 번역된 텍스트를 text_output.insert로 출력합니다.
 

4. GUI 구성💻

root = Tk() #윈도우 생성
root.title("번역기") #윈도우 제목 설정
root.geometry("500x600") #윈도우 크기 설정 
 
# 원본 언어 선택 콤보박스
Label(root, text="원본 언어 선택:").pack()  # 원본 언어 라벨
source_lang_var = StringVar()  # 원본 언어 변수
source_lang_var.set("자동선택")  # 기본값 설정
source_lang_combo = Combobox(root, textvariable=source_lang_var, values=["자동선택"] + language_list, state="readonly", height=5)
source_lang_combo.pack()  # 콤보박스 배치

# 대상 언어 선택 콤보박스
Label(root, text="대상 언어 선택:").pack()  # 대상 언어 라벨
target_lang_var = StringVar()  # 대상 언어 변수
target_lang_var.set("한국어")  # 기본값 설정
target_lang_combo = Combobox(root, textvariable=target_lang_var, values=language_list, state="readonly", height=5)
target_lang_combo.pack()  # 콤보박스 배치

# 번역할 텍스트 입력
Label(root, text="번역할 텍스트:").pack()  # 텍스트 입력 라벨
text_input = Text(root, height=10, width=50)  # 텍스트 입력창
text_input.pack()  # 텍스트 입력창 배치

# 번역 결과 출력
Label(root, text="번역 결과:").pack()  # 번역 결과 라벨
text_output = Text(root, height=10, width=50)  # 번역 결과 출력창
text_output.pack()  # 출력창 배치

# 번역 버튼
Button(root, text="번역하기", command=translate_text).pack()  # 버튼 클릭 시 translate_text 함수 실행

5. 프로그램 실행💻

root.mainloop()
 
  • Tkinter 이벤트 루프를 시작하여 GUI를 동작하게 만듭니다.
 

실행 결과

새로운 윈도우 창이 열립니다.

 

 

 

728x90