본문 바로가기
컴퓨터

[파이썬]요새 만들고 있는거: 수능 문제 힌트주기(?) 프로그램

by Oh 선생 2019. 11. 21.

#0. 

프로그램 공부할 땐 뭔가 프로젝트를 돌리는 게 제일 좋지 싶다. 그래서 뭘 만들어볼까... 하다가 수능 문제를 띄워주고, 필요에 따라 힌트를 제공하는 프로그램을 만들면 좋겠다 싶었다. 보통 인터넷에서 수능 기출문제를 찾으면 문제와 풀이 의 두 단계로만 이루어져있지, 문제-힌트-풀이의 단계를 가진 자료는 없으니까. 이렇게 만들어야 나중에 수업에 활용하기도 좋다. 그래서 뚝딱뚝딱...

#1. 

최종적인 형태는 실행파일로 바꿔서 아이들이 집에서 공부할 때 쓸 수 있게 만드는 거다. 그러려면 GUI를 써야 한다. 문제는 내가 GUI를 개뿔 모른다는거... 모르는 건 공부하면 된다. 

파이썬에서 GUI를 구현하는 방법은 

- GUI화면을 구성한다. 

- 실제 어떻게 작동할지를 결정할 함수들을 만든다. 

- GUI화면의 요소들에 함수들을 연결해준다. 

정도이다. 이 중 GUI화면을 구성하는 게 일차적으로 큰 일인데, 이땐 Qt Designer를 사용하면 된다. 

대강 이렇게 생겼다. 아나콘다를 쓰면, C:\Users\user18\Anaconda3\Library\bin 정도의 폴더에 있다. designer.exe.

실행하고 메인윈도우를 만든 뒤, 원하는 요소들을 척척척 올려놓으면 된다. 

Qt Designer로 만든 UI는 아직 파이썬에서 쓸 수 없다. 이걸 사용하려면 파이썬에서 따로 불러와야 한다. 

https://wikidocs.net/5227

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

이 부분을 참고해서 만들었다. 

 

#2. 

GUI를 만들었으니 다음은 프로그램 만들기다. 

import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import cv2
import numpy as np
import platform

def hangulFilePathImageRead ( filePath ) :

    stream = open( filePath.encode("utf-8") , "rb")
    bytes = bytearray(stream.read())
    numpyArray = np.asarray(bytes, dtype=np.uint8)
    return cv2.imdecode(numpyArray , cv2.IMREAD_UNCHANGED)


form_class = uic.loadUiType("D:\project\수능문제풀이 프로그램\problems.ui")[0]
mogo6=[]
mogo9=[]
suneung=[]

for i in range(2019, 2014,-1):
    mogo6.append(str(i)+'_6월')
    mogo9.append(str(i)+'_9월')
    suneung.append(str(i)+'_수능')

years=suneung #이건 나중에 6월 9월 추가할 때 리스트에 추가: +mogo9+mogo6
problemnumber=list(map(str,range(1,31)))


class MyWindow(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        #메뉴바 내용 구성
        self.actionwho.setStatusTip('개발자를 보여줍니다.')
        self.actionwho.triggered.connect(self.btn_clicked)

        self.actionexit.setShortcut('Ctrl+Q')
        self.actionexit.setStatusTip('프로그램을 종료합니다.')
        self.actionexit.triggered.connect(self.close)

        #콤보박스 구성
        self.comboBox.addItems(years)
        self.comboBox_2.addItems(problemnumber)
        self.comboBox_2.activated[str].connect(self.problem_show)

        #힌트버튼 구성
        self.pushButton.clicked.connect(self.hint1)
        self.pushButton_2.clicked.connect(self.hint2)
        self.pushButton_3.clicked.connect(self.hint3)

        #종료버튼
        self.pushButton_5.clicked.connect(self.close)

        
    def btn_clicked(self):
        QMessageBox.about(self, "만든이 ","오국환 \n http://ratel35.tistory.com")

    def problem_show(self):
        year=self.comboBox.currentText()
        number=self.comboBox_2.currentText()
        path=".\\"+year[0:4:]+"\\"
        filePath=path+year+number+ ".jpg"
        problemimg=hangulFilePathImageRead(filePath)
        cv2.imshow(year+number, problemimg)

    def hint1(self):
        year=self.comboBox.currentText()
        number=int(self.comboBox_2.currentText())
        path=".\\"+year[0:4:]+"\\"
        filePath=path+year[0:4:]+"_su_hint.txt"
        hinttxt=open(filePath,'r', encoding='utf-8')
        data=hinttxt.readlines()
        self.label_3.setText(data[3*number -3])
        
    def hint2(self):
        year=self.comboBox.currentText()
        number=int(self.comboBox_2.currentText())
        path=".\\"+year[0:4:]+"\\"
        filePath=path+year[0:4:]+"_su_hint.txt"
        hinttxt=open(filePath,'r', encoding='utf-8')
        data=hinttxt.readlines()
        self.label_3.setText(data[3*number -2])

    def hint3(self):
        year=self.comboBox.currentText()
        number=int(self.comboBox_2.currentText())
        path=".\\"+year[0:4:]+"\\"
        filePath=path+year[0:4:]+"_su_hint.txt"
        hinttxt=open(filePath,'r', encoding='utf-8')
        data=hinttxt.readlines()
        self.label_3.setText(data[3*number -1])        

if __name__=="__main__":
    app=QApplication(sys.argv)
    myWindow=MyWindow()
    myWindow.show()
    app.exec_()
    

 

별걸 다 사용하고 있다.

한글파일명을 사용하려니 제대로 읽어지질 않아서 hangulFilePathImageRead 함수를 사용했다. 이건 다음 블로그를 참조했다. (코딩이라는게 원래 이런가 싶다. 내가 직접 만드는 건 별로 없고 대부분 여기저기서 갖다 붙인다.)

https://zzdd1558.tistory.com/228

 

[Python] OpenCV를 이용한 imread중 image 한글파일 경로 입력시 문제와 해결방안.

저는 Mac OS OpenCV와 python 개발 환경에서 영상 프로그래밍 개발을 하고있습니다 . MacOS에서 작업을 끝내고 해당 윈도우 OS가 올라가 있는 랩탑에서 확인하는 도중 에러가 발생하여 확인해보니 한글이 포함된..

zzdd1558.tistory.com

 

#3. 

다음은 실제 프로그램에서 사용할 자료 만들기다. 수능 문제를 캡처해서 이미지 파일로 만들고, 힌트를 작성한다. 

이런 식으로 문제를 이미지별로 잘라놓고

이런 식으로 힌트를 작성한다. 아무래도 툴의 한계가 있다보니 예쁘게 쓰기가 어렵다. 더 예쁘게 하려면 힌트도 이미지로 처리하면 될건데 메인윈도우에서 그림 출력하는 방법을 아직 모르겠다(...). 원래는 21, 29, 30만 하려고 했으나 애들이 그것만 어려워 하는건 아닌지라, 하나씩 앞에서부터 힌트를 넣고 있다. 

 

#4. 

현재 버전은 이렇다. 

이렇게 생겼고, 연도와 문항번호를 선택하면

이런 느낌으로 문제 이미지가 팝업으로 뜬다. 

힌트 버튼을 누르면 순서대로 이런 힌트가 제공된다.

텍스트가 길면 오른쪽을 벗어난다. 뭔가 아직 고칠게 많다(...)

메뉴를 누르면 저렇게 뜬다. 

아직 문항정보나, 정답과 해설 부분은 구현하지 않았다. 조금 만들다보니 지친다(...). 

시간 날 때 쉬엄쉬엄 해나가야 겠다. 

태그

,

댓글0