bubble - 영어 시험지 제작 프로그램 프로젝트

bubble의 시작

영어학원 4개에서 아르바이트를 하다가 느낀 것은 매주 원생들을 대상으로 영어 작문 시험을 실시한다는 것이었다. 보통 알바생(거의 대학생)이 제작을 도맡게 되는데 영어 문장만 주어지는 경우가 많아 직접 번역을 하던지, 파파고를 돌리던지 해서 시험지 형태로 제작을 해야 했다. 학원을 오가다가 프로그램 제작을 계획하고, 2019년 여름 제작에 돌입했다.

알고리즘을 짜보자

제작에 필요한 알고리즘은 간단했다.

1. 영어 문장을 입력받는다.
2. 파파고 api를 이용해서 한글로 번역한 데이터를 저장한다.
3. 데이터를 시험지 형식으로 바꾼다. (문제 형식으로)

파이썬 gui 프로그램은 처음 제작해봐서 pyqt5에 대한 공부를 많이 했다. api는 네이버 파파고측에서 개발자 이용 신청을 하면 key를 발급해주고 필요한 메소드들을 제공하기 때문에 큰 고민이 없었다.

GUI는 pyqt5 라이브러리 기반으로 코드를 직접 작성해도 되지만 QT Designer라는 좋은 툴이 있어서 편하게 작업했다. GUI 개체들과 파파고의 api를 연결하는 부분, 파파고에서 번역된 결과를 한글 문장에 맞게 리턴하는 부분에 각별히 신경썼다.

필요한 라이브러리들은 다음과 같다. 파파고 서버와 통신하기 위한 urllib, gui를 위한 PyQt5.

import urllib.request
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QTextCursor
cs

코드를 작성하자

우선 가장 핵심적인 부분, 파이썬 서버와 연결하여 번역된 문장을 가져오는 함수이다.

    def translate(self, context):
        global client_id, client_secret
        data = "source=en&target=ko&text=" + context
        url = "https://openapi.naver.com/v1/papago/n2mt"
        request = urllib.request.Request(url)
        request.add_header("X-Naver-Client-Id", client_id)
        request.add_header("X-Naver-Client-Secret", client_secret)
        response = urllib.request.urlopen(request, data=data.encode("utf-8"))
        rescode = response.getcode()
        if (rescode == 200):
            response_body = response.read().decode('utf-8')
            res = response_body[152:len(response_body) - 41]
            return res
        else:
            return "번역 실패"
cs

response_body와 res를 따로 구분한 이유는 파파고에서 보내는 값은 한글로 번역된 문장만 있는 것이 아니고 enc-type 등의 프로퍼티들도 포함되어 있어 필요한 부분만 잘라냈다.

이제 번역된 결과를 버튼을 클릭하면 시험지 형식으로 넣어주기만 하면 된다.

    def btn_clicked(self):
        global context, result, storedString, count
        context = self.box_addString.text()
        if(context == ""):
            return 0
        result = self.translate(context)
        count += 1
        if(self.Chk_hideans.isChecked() == True):
            self.box_addString.setFocus()
            storedString += str(count) + ". " + result + '\n' + context + '\n\n'
        else:
            self.box_addString.setFocus()
            storedString += str(count) + ". " + result + '\n\n\n'
        self.view_storedString.setText(storedString)
        self.view_storedString.moveCursor(QTextCursor.End)
        self.box_addString.setText("")
        self.box_addString.setFocus()
        self.box_addString.setPlaceholderText("Enter English - Sentence " + str(count + 1))
cs

넣기만 하면 사용자가 불편해할테니 버튼 클릭을 Enter키로 대체할 수 있게, 영어 문장 입력칸에 다시 Focus를 줆으로써 불편함을 줄였다.

그리고 가장 유용한 기능을 추가했는데, 선생님 채점용, 학생 시험용을 체크로 구분할 수 있어 입맛에 맞게 써먹을 수 있다.

새로운 시험지를 제작하려할 때 프로그램을 껐다 켤 수는 없으니 New 버튼을 만들었다.

def btn_new(self):
    global count, storedString
    storedString = ""    self.box_addString.setText("")
    self.view_storedString.setText("")
    self.box_addString.setFocus()
    self.box_addString.setPlaceholderText("New work started - Enter English")
    count = 0
cs

영어 문장 입력칸에 Placeholder로 정보들을 출력해주니 깔끔하고 사용자가 보기에도 지장이 없었다.

그렇게 그럴듯한 bubble이 만들어졌다.



학원 원장님에게 극찬을 받았다. 좀 더 보수하고 웹 api로 다시 만든다면 조만간 시작할 EduMong 프로젝트에도 기능을 추가할 수 있을 듯..

(사실 이 프로젝트를 할 때만 해도 블로그를 하지 않았는데 블로거를 시작한 김에 기록해두고 싶어서 이제와서 썼다.)

프로젝트 폴더는 Github에 올려두었다.

Github Repository: https://github.com/zinirun/bubble

댓글 2개:

Powered by Blogger.