7 분 소요

시작하며

영어 공부를 시작하며 알고 있는 단어가 매우 부족하다고 판단이 되어 영어 단어를 외우려 했는데 초중고 시절과 다르게 외우는 게 힘들었다. 그래서 계속 반복적으로 봐야 외워질 거 같아서 간단하게 코드 돌려서 외워야 한다는 생각에 짧게 짜봤다.

코드가 필요한 사람을 위해 Github에 커밋해 뒀다. 그리고 오늘은 내가 작성한 코드를 한번 보려고 한다. 밑에 있는 코드는 간단한 프로그램 2개를 만들었는데 통합 아닌 통합을 시킨 프로그램 소스이다. 주석 처리와 함께 보면 편하다.

통합코드

# 모듈 임포트
import os
import random
import subprocess
from tkinter import *

# MainMenu 클래스 정의
class MainMenu:
    def __init__(self, master):
        self.master = master  # 주 창 객체 저장
        self.master.title("English Learning App")  # 창의 제목 설정
        self.master.geometry("450x150")  # 창의 크기 설정

        # 타이틀 라벨 생성 및 배치
        self.title = Label(self.master, text="Choose an option:", font=("Arial", 14))
        self.title.pack(pady=10)

        # 상단 버튼 프레임 생성 및 배치
        self.button_frame_top = Frame(self.master)
        self.button_frame_top.pack(pady=5)

        # 상단 버튼 생성 및 배치
        self.study_button = Button(self.button_frame_top, text="1. 영어 단어 맞추기", font=("Arial", 12), command=self.start_study_korean, width=20)
        self.study_button.pack(side=LEFT, padx=5)
        self.flashcards_button = Button(self.button_frame_top, text="2. 영어 카드 맞추기", font=("Arial", 12), command=self.start_flashcards, width=20)
        self.flashcards_button.pack(side=LEFT, padx=5)

        # 하단 버튼 프레임 생성 및 배치
        self.button_frame_bottom = Frame(self.master)
        self.button_frame_bottom.pack(pady=5)

        # 하단 버튼 생성 및 배치
        self.random_button = Button(self.button_frame_bottom, text="3. 랜덤 실행", font=("Arial", 12), command=self.start_random, width=20)
        self.random_button.pack(side=LEFT, padx=5)
        self.exit_button = Button(self.button_frame_bottom, text="종료", font=("Arial", 12), command=self.master.quit, width=20)
        self.exit_button.pack(side=LEFT, padx=5)

    # study_english.py 스크립트를 실행하는 메서드
    def start_study_korean(self):
        subprocess.Popen(["python", "study_english.py"])

    # english_card_game.py 스크립트를 실행하는 메서드
    def start_flashcards(self):
        subprocess.Popen(["python", "english_card_game.py"])

    # 무작위로 study_english.py 또는 english_card_game.py 스크립트를 실행하는 메서드
    def start_random(self):
        random_choice = random.choice([self.start_study_korean, self.start_flashcards])
        random_choice()

# 메인 스크립트 실행
if __name__ == "__main__":
    main_root = Tk()  # Tk 객체 생성
    main_app = MainMenu(main_root)  # MainMenu 인스턴스 생성 및 main_root 전달
    main_root.mainloop()  # 이벤트 루프 시작하여 사용자의 입력 처리하고 GUI 유지

이렇게 코드는 반복적으로 영어 단어를 학습 할 수 있게 구현한 파이썬 스크립트이다. 주요 구성 요소는 Tkinter 라이브러리를 사용하여 그래픽 사용자 인터페이스(GUI)를 생성 했다.

우선 코드에서 필요한 모듈을 불러 와야 한다.

  • os: 운영 체제와 상호 작용하는 기능 제공
  • random: 난수 생성을 위한 기능 제공
  • subprocess: 새 프로세스를 생성하여 다른 파이썬 스크립트를 실행할 수 있게 해준다.
  • tkinter: GUI 프로그래밍을 위한 라이브러리 MainMenu 클래스를 정의한다.

생성자 init(self, master)는 다음을 수행한다. 인스턴스 변수 master를 저장한다. 창의 제목과 크기를 설정한다. 화면에 표시할 위젯들을 생성하고 배치한다. (Label, Button, Frame 등) 버튼에 대한 명령을 설정한다. (예: self.start_study_korean) MainMenu 클래스의 메서드를 정의 한다.

start_study_korean: “study_english.py” 스크립트를 실행한다. start_flashcards: “english_card_game.py” 스크립트를 실행한다. start_random: start_study_korean과 start_flashcards 중 하나를 무작위로 선택해 실행한다. 스크립트의 메인 부분에서 다음을 수행한다.

Tk 객체 (main_root)를 생성한다. MainMenu 인스턴스 (main_app)를 생성하고, main_root를 전달한다. main_root.mainloop()를 호출하여 이벤트 루프를 시작합니다. 이를 통해 사용자의 입력을 처리하고 GUI를 유지한다. 이 애플리케이션의 목적은 사용자가 주어진 옵션 중 하나를 선택하면 관련된 영어 학습 게임을 실행하는 것입니다. 게임은 “study_english.py”와 “english_card_game.py” 스크립트로 구현되어 있으며, 이 애플리케이션은 해당 스크립트를 실행하는 데 사용된다.

영어단어 맞추기

import pandas as pd
from tkinter import Tk, Frame, Label, Entry, Button, messagebox, StringVar, LEFT

# 엑셀 파일로부터 데이터를 가져오는 함수
def import_data(filename):
    return pd.read_excel(filename, engine='openpyxl')

# 한국어 단어 학습을 위한 클래스
class StudyKorean:
    def __init__(self, master, data):
        self.master = master
        self.data = data
        self.index = -1
        self.correct_answers = 0
        self.total_words = len(self.data)

        # 창 설정
        self.master.title("Learn English Words")
        self.master.geometry("430x230")

        # 라벨, 입력창 및 버튼 생성
        self.word_label = Label(self.master, text="Korean:", font=("Arial", 14))
        self.word_label.pack(pady=10)

        self.hint_label = Label(self.master, text="Hint: ", font=("Arial", 12))
        self.hint_label.pack(pady=5)

        self.entry = Entry(self.master, font=("Arial", 12))
        self.entry.pack(pady=5)
        self.entry.focus_set()
        self.entry.bind('<Return>', self.check_word)

        self.button_frame = Frame(self.master)
        self.button_frame.pack(pady=5)

        self.check_button = Button(self.button_frame, text="Check", font=("Arial", 12), command=self.check_word)
        self.check_button.pack(side=LEFT, padx=5)

        self.hint_button = Button(self.button_frame, text="Show hint", font=("Arial", 12), command=self.show_hint)
        self.hint_button.pack(side=LEFT, padx=5)

        self.skip_button = Button(self.button_frame, text="Skip", font=("Arial", 12), command=self.next_word)
        self.skip_button.pack(side=LEFT, padx=5)

        self.stop_button = Button(self.button_frame, text="Stop", font=("Arial", 12), command=self.end_game)
        self.stop_button.pack(side=LEFT, padx=5)

        # 진행 상황 라벨 생성
        self.progress_text = StringVar()
        self.progress_label = Label(self.master, textvariable=self.progress_text, font=("Arial", 12))
        self.progress_label.pack(pady=5)
        self.update_progress()

        self.next_word()

    # 다음 단어를 불러오는 함수
    def next_word(self):
        if self.correct_answers == self.total_words:
            self.end_game()
            return

        self.data = self.data.sample(frac=1).reset_index(drop=True)
        self.index += 1
        if self.index >= len(self.data):
            self.index = 0

        self.current_word = self.data.iloc[self.index]
        self.word_label.config(text="Korean: " + self.current_word['korean'])
        self.hint_label.config(text="Hint: ")
        self.entry.delete(0, "end")

    # 입력된 단어를 확인하는 함수
    def check_word(self, event=None):
        user_input = self.entry.get().strip()
        if user_input.lower() ==
            self.current_word['english'].lower():
        self.correct_answers += 1
        self.update_progress()
        self.data.drop(self.index, inplace=True)
        self.data.reset_index(drop=True, inplace=True)
        self.next_word()
    else:
        messagebox.showerror("Incorrect", "The answer is incorrect.")
        self.show_hint()
        self.next_word()

    # 힌트를 보여주는 함수
    def show_hint(self):
        self.hint_label.config(text="Hint: " + self.current_word['hint'])

    # 진행 상황을 업데이트하는 함수
    def update_progress(self):
        self.progress_text.set(f"Progress: {self.correct_answers}/{self.total_words}")

    # 게임 종료 함수
    def end_game(self):
        messagebox.showinfo("Game over", f"You've guessed {self.correct_answers}/{self.total_words} words correctly.")
    self.master.destroy()

이 코드는 한국어-영어 단어 학습 프로그램을 구현한 파이썬 스크립트 이며. 주요 구성 요소는 pandas 라이브러리를 사용하여 데이터를 가져오고 처리하고, Tkinter 라이브러리를 사용하여 그래픽 사용자 인터페이스(GUI)를 생성하는 것이다.

필요한 모듈을 불러온다.

  • pandas: 데이터 분석 및 처리를 위한 라이브러리
  • tkinter: GUI 프로그래밍을 위한 라이브러리
  • import_data(filename) 함수를 정의한다.

filename: 읽어올 엑셀 파일 이름 pd.read_excel을 사용하여 엑셀 파일에서 데이터를 불러온 뒤 반환한다. StudyKorean 클래스를 정의한다.

생성자 init(self, master, data)는 다음을 수행한다. 인스턴스 변수 master와 data를 저장한다. 창의 제목과 크기를 설정한다. 화면에 표시할 위젯들을 생성하고 배치한다. (Label, Entry, Button, Frame 등) 사용자가 Enter 키를 누르면 check_word 메서드를 호출하도록 바인딩한다. 게임 진행 상황을 업데이트하고 첫 단어를 표시한다. StudyKorean 클래스의 메서드를 정의한다.

next_word: 다음 단어를 표시하고, 정답을 모두 맞췄을 경우 프로그램을 종료한다. check_word: 사용자의 입력이 정답과 일치하는지 확인하고, 정답을 맞춘 경우 게임 진행 상황을 업데이트하고 다음 단어를 표시한다. 틀린 경우 힌트를 표시하고 다음 단어를 표시한다. show_hint: 힌트를 표시한다. update_progress: 문제 진행 상황을 업데이트한다. end_game: 프로그램을 종료하고 정답 맞춘 개수를 알려준다. 스크립트의 메인 부분에서 다음을 수행한다.

  1. “words.xlsx” 파일에서 데이터를 불러온다.
  2. 데이터를 무작위로 섞는다.
  3. Tk 객체 (root)를 생성한다.
  4. StudyKorean 인스턴스 (app)를 생성하고, root와 data를 전달한다.
  5. root.mainloop()를 호출하여 이벤트 루프를 시작한다. 이를 통해 사용자의 입력을 처리하고 GUI를 유지한다.
  6. 이 프로그램의 목적은 사용자가 주어진 한국어 단어의 영어 번역을 맞추는 것이다. 사용자가 정답을 맞추거나 틀린 경우, 다음 단어가 표시되고 프로그램은 계속 진행된다. 사용자는 힌트를 요청할 수 있으며, 건너뛰거나 게임을 언제든지 중단할 수 있다. 게임이 끝나면 사용자가 맞춘 단어 수와 전체 단어 수를 알려준다.

이 프로그램은 사용자가 한국어-영어 단어 학습을 쉽게 할 수 있도록 도와준다. 사용자는 주어진 한국어 단어에 대해 영어 번역을 입력하고, 입력한 번역이 정확한지 확인할 수 있다. 이를 통해 사용자는 영어 단어 학습에 대한 피드백을 즉시 받아 볼 수 있으며, 이를 통해 학습 과정을 개선할 수 있다.

또한, 이 프로그램은 pandas를 사용하여 데이터를 처리하고 관리하므로, 원하는 단어 데이터를 쉽게 추가하거나 변경할 수 있다. 엑셀 파일 형식을 사용하면 워드 데이터를 쉽게 관리할 수 있다. 이 프로그램은 단어 데이터를 무작위로 섞어서 사용자에게 제공함으로써, 학습 과정에 다양성을 제공하고 반복 학습을 지원한다.

영어 카드 맞추기

import csv
import random
from tkinter import *

# CSV 파일에서 단어를 불러오는 함수
def load_words_from_csv(file_name):
    words = []

    with open(file_name, "r", encoding="utf-8") as file:
        reader = csv.reader(file)
        for row in reader:
            korean, english = row
            words.append((korean, english))

    return words

# 문제를 생성하는 함수
def create_problem(remaining_words):
    correct_word = random.choice(remaining_words)
    wrong_words = random.sample([word for word in words if word != correct_word], 4)
    options = wrong_words + [correct_word]
    random.shuffle(options)

    return correct_word, options

# 사용자의 답을 확인하고 결과를 표시하는 함수
def check_answer(user_choice, correct_word, lbl_result):
    global remaining_words, correct_count

    if user_choice == correct_word[1]:
        lbl_result.config(text="정답입니다!", fg="green")
        remaining_words.remove(correct_word)
        correct_count += 1
        start_game()
    else:
        lbl_result.config(text=f"틀렸습니다. 정답은 {correct_word[1]} 입니다.", fg="red")
        app.after(2000, start_game)

    lbl_score.config(text=f"{correct_count}/{len(words)}")

    if not remaining_words:
        lbl_result.config(text="모든 문제를 맞추셨습니다! 프로그램을 종료합니다.", fg="blue")
        app.after(3000, close_app)

# 게임을 시작하는 함수
def start_game():
    correct_word, options = create_problem(remaining_words)
    lbl_korean.config(text=correct_word[0])
    lbl_result.config(text="")
    for i, option in enumerate(options):
        btn_options[i].config(text=option[1], command=lambda choice=option[1]: check_answer(choice, correct_word, lbl_result))

# 앱을 종료하는 함수
def close_app():
    app.destroy()

# 메인 실행 블록
if __name__ == "__main__":
    words = load_words_from_csv("words.csv")
    remaining_words = words.copy()
    correct_count = 0

    # Tkinter 애플리케이션 생성
    app = Tk()
    app.title("영어 단어 공부")

    # 정답 개수/전체 단어 수를 표시하는 레이블
    lbl_score = Label(app, font=("Helvetica", 20), text=f"{correct_count}/{len(words)}")
    lbl_score.pack(pady=10)

    # 한국어 단어를 표시하는 레이블
    lbl_korean = Label(app, font=("Helvetica", 30))
    lbl_korean.pack(pady=20)

    # 옵션 버튼 생성 및 패킹
    btn_options = []
    for _ in range(5):
        btn = Button(app, font=("Helvetica", 15), width=20, height=2)
        btn.pack(pady=5)
        btn_options.append(btn)

    # 결과 메시지를 표시하는 레이블
    lbl_result = Label(app, font=("Helvetica", 20))
    lbl_result.pack(pady=20)

    # 게임 시작
    start_game()

        # 종료 버튼 생성 및 패킹
    btn_exit = Button(app, text="종료", font=("Helvetica", 15), width=20, height=2, command=close_app)
    btn_exit.pack(pady=20)

    # Tkinter 애플리케이션 이벤트 루프 실행
    app.mainloop()

이 코드는 영어 단어 공부 프로그램을 만드는 데 사용되며, Tkinter를 사용하여 GUI를 구성하고 있으며 구체적으로 다음과 같은 기능을 가진 프로그램이다.

  1. CSV 파일에서 단어를 불러온다. (데이터 처리를 엑셀보다 CSV가 더 편했고 VSCODE에서도 열리기 때문에 데이터 관리가 편했다.)
  2. 주어진 단어 중 무작위로 선택하여 문제를 생성한다.
  3. 사용자가 정답을 선택하면, 정답 여부를 확인하고 결과를 표시한다.
  4. 모든 단어를 맞출 때까지 문제를 반복한다.

코드의 주요 구성 요소는 다음과 같다.

load_words_from_csv(file_name): CSV 파일에서 한국어와 영어 단어 쌍을 불러오는 함수이다. create_problem(remaining_words): 남은 단어 중에서 무작위로 하나를 선택하고, 잘못된 답안 4개와 함께 문제를 생성하는 함수이다. check_answer(user_choice, correct_word, lbl_result): 사용자가 선택한 답이 정답인지 확인하고, 결과를 표시하는 함수이다. start_game(): 게임을 시작하고 문제를 생성하여 GUI에 표시하는 함수이다. close_app(): 프로그램을 종료하는 함수이다. if name == “main”: 블록에서 단어를 불러오고, 변수를 초기화하며, Tkinter 애플리케이션을 구성한다.

이 구성은 다음과 같다. lbl_score: 정답 개수와 전체 단어 수를 표시하는 레이블 이다. lbl_korean: 한국어 단어를 표시하는 레이블 이다. btn_options: 사용자가 선택할 수 있는 옵션 버튼 5개이다. lbl_result: 정답 여부 및 결과 메시지를 표시하는 레이블 이다. btn_exit: 프로그램을 종료하는 버튼이다. 프로그램은 Tkinter 이벤트 루프를 실행하며, 사용자가 문제를 푸는 동안 반복적으로 게임을 진행한다.

코드 마지막 부분에서는 다음과 같은 요소들이 있다.

종료 버튼(btn_exit): 프로그램을 종료할 수 있는 버튼을 생성하고 패킹한다. 이 버튼은 close_app 함수를 실행하게끔 설정되어 있다. app.mainloop(): Tkinter 애플리케이션의 이벤트 루프를 실행한다. 이렇게 해서 사용자와 상호작용할 수 있는 GUI 애플리케이션이 만들어진다. 이벤트 루프는 사용자가 종료 버튼을 누르거나, 모든 문제를 맞출 때까지 계속 실행된다. 이 프로그램은 사용자가 영어 단어를 학습하는 데 도움을 주기 위해 개발되었다. 사용자는 주어진 한국어 단어와 일치하는 영어 단어를 선택하면서 영어 단어를 연습할 수 있다. 이를 통해, 사용자는 단어를 외우고 학습하는 데 도움을 받을 수 있다.

사실 누구나 작성할 수 있는 코드이며 대단한 코드는 아니다. 그러나 누군가에게는 필요할 수도 있다고 생각하여 한번 글로 작성해 봤다. 누군가에게 도움이 되었으면 한다.

자세한 코드는 https://github.com/pstor-eon/study_english 여기서 확인 하시면 됩니다.

맨 위로 올라가기

저의 글을 읽어 주셔서 감사합니다. 문제가 있으면 저의 메일로 연락 주시면 감사하겠습니다. 댓글과 피드백 또한 감사합니다.
Thank you for visiting my blog. If you have any problems, please contact me by e-mail. Thanks also for the comments and feedback.

태그: , , ,

카테고리:

업데이트:

댓글남기기