데이터 분석/파이썬

파이썬으로 영단어 공부하기

쎄마비 2022. 5. 4. 10:00
728x90
반응형

파이썬 연습차 영단어를 공부할 수 있는 단어장을 만들어 보았습니다.

이번에는 데이터프레임과 PyQT를 사용해보는데 의의를 두었습니다.

 

import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic
from PyQt5.QtCore import Qt
from mygraphwidget import *
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

form_class = uic.loadUiType('voca_study.ui')[0]

class MyWindow(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.score = 0
        self.note_df = pd.DataFrame(columns=['한국어','영어'])
        self.q_df = pd.DataFrame(columns=['한국어','영어'])
        self.q_df_temp = pd.DataFrame(columns=['한국어','영어'])
        self.index_no = 0
        self.not_q = 0
        self.graph_present = 0
        self.noteCombo.setEditable(True)
        self.noteCombo.lineEdit().setAlignment(Qt.AlignCenter)
        self.noteCombo.lineEdit().setReadOnly(True)

# 단어 파일 업로드 버튼
    def upload(self):
        self.q_df_old = self.q_df
        self.q_df_temp_old = self.q_df_temp
        fileNameTuple = QFileDialog.getOpenFileName(self, 'OpenFile', '', 'Excel (*.xls *xlsx)')
        fileName = fileNameTuple[0]
        if fileName != '':
            self.q_df = pd.read_excel(fileName)
            self.q_df_temp = pd.read_excel(fileName)
            QMessageBox.about(self, '알림', '총 ' + str(self.q_df_temp.shape[0]) + '개의 단어를 불러왔습니다!')
            if self.q_df_temp_old.shape[0] != 0:
                self.q_df_temp = pd.concat([self.q_df_temp_old, self.q_df_temp])
                self.q_df = pd.concat([self.q_df_old, self.q_df])

# 오답노트 저장하기 버튼
    def download(self):
        if self.note_df.shape[0] != 0:
            saveName = QFileDialog.getSaveFileName(self, 'SaveFile', '', 'txt(*.txt)')[0]
            self.note_df.to_csv(saveName, sep = '\t')
            QMessageBox.about(self, '알림', '저장 완료!')
        else:
            QMessageBox.about(self, '알림', '저장할 내용이 없습니다')

# 처음부터 다시풀기 버튼
    def init_q(self):
        self.recheck = QMessageBox.question(self, '질문', '정말로 지금까지 푼 문제 정보를 초기화할까요?')
        if self.recheck == QMessageBox.Yes:
            self.init_common()
            self.q_df = self.q_df_temp
            QMessageBox.about(self, '알림', '업로드한 파일 외 데이터가 초기화되었습니다')

# 전체 초기화 버튼
    def init_all(self):
        self.recheck = QMessageBox.question(self, '질문', '정말로 모든 정보를 초기화할까요?')
        if self.recheck == QMessageBox.Yes:
            self.init_common()
            self.q_df = pd.DataFrame(columns=['한국어','영어'])
            self.q_df_temp = pd.DataFrame(columns=['한국어','영어'])
            QMessageBox.about(self, '알림', '모든 데이터가 초기화되었습니다')

# 초기화 공통 부분
    def init_common(self):
        self.score = 0
        self.lineEdit_score.setText('')
        self.note_df = pd.DataFrame(columns=['한국어','영어'])
        self.index_no = 0
        self.lineEdit_q.setText('')
        self.lineEdit_a.setText('')
        self.noteTable.setRowCount(0)
        self.noteTable.setColumnCount(2)
        self.hide_graph()

# 다음 문제 버튼
    def next_q(self):
        q_row_len = self.q_df.shape[0]
        if q_row_len != 0:
            self.index_no = int(np.random.choice(q_row_len, 1, False))
            q_text = self.q_df.iloc[self.index_no, 1]
            self.lineEdit_q.setText(q_text)
            self.lineEdit_a.setText('')
            self.not_q = 0
        else:
            QMessageBox.about(self, '알림', '남은 문제가 없습니다!')

# 정답 제출 버튼
    def check_a(self):
        if self.not_q != 1:
            if self.lineEdit_q.text() != '' and self.lineEdit_a.text() != '':
                if self.q_df.iloc[self.index_no, 0] == self.lineEdit_a.text():
                    self.score += 1
                    QMessageBox.about(self, '알림', '정답입니다!')
                else:
                    add_note = self.q_df.loc[self.index_no,:]
                    self.note_df.loc[self.note_df.shape[0]] = add_note
                    self.noteTable.setRowCount(self.note_df.shape[0])
                    self.noteTable.setColumnCount(self.note_df.shape[1])
                    for i in range(self.note_df.shape[0]):
                        for j in range(self.note_df.shape[1]):
                            self.noteTable.setItem(i, j, QTableWidgetItem(self.note_df.iloc[i, j]))
                    self.noteTable.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
                    QMessageBox.about(self, '알림', '오답입니다 ㅠㅠ 오답 노트에 틀린 문제를 추가할게요')
                self.lineEdit_score.setText(str(self.score) + ' / ' + str(self.score + self.note_df.shape[0]) + ' 점')
                self.q_df = self.q_df.drop(self.index_no)
                self.q_df = self.q_df.reset_index(drop = True)
                self.not_q = 1
                self.lineEdit_q.setText('다음 문제를 클릭하세요')
                self.show_graph()
        else:
            QMessageBox.about(self, '알림', '다음 문제 버튼을 눌러주세요!')

# 테이블 관리 콤보박스
    def table_change(self):
        if self.noteCombo.currentIndex() == 0:
            self.view_q_all()
        elif self.noteCombo.currentIndex() == 1:
            self.view_q()
        elif self.noteCombo.currentIndex() == 2:
            self.view_note()
        else:
            self.hide_note()

# 전체 문제 보기 기능
    def view_q_all(self):
        self.noteTable.setRowCount(self.q_df_temp.shape[0])
        self.noteTable.setColumnCount(self.q_df_temp.shape[1])
        for i in range(self.q_df_temp.shape[0]):
            for j in range(self.q_df_temp.shape[1]):
                self.noteTable.setItem(i, j, QTableWidgetItem(self.q_df_temp.iloc[i, j]))
        self.noteTable.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        QMessageBox.about(self, '알림', '전체 단어 목록을 표시할게요')

# 남은 문제 보기 기능
    def view_q(self):
        self.noteTable.setRowCount(self.q_df.shape[0])
        self.noteTable.setColumnCount(self.q_df.shape[1])
        for i in range(self.q_df.shape[0]):
            for j in range(self.q_df.shape[1]):
                self.noteTable.setItem(i, j, QTableWidgetItem(self.q_df.iloc[i, j]))
        self.noteTable.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        QMessageBox.about(self, '알림', '남은 단어 목록을 표시할게요')

# 오답노트 보기 기능
    def view_note(self):
        self.noteTable.setRowCount(self.note_df.shape[0])
        self.noteTable.setColumnCount(self.note_df.shape[1])
        for i in range(self.note_df.shape[0]):
            for j in range(self.note_df.shape[1]):
                self.noteTable.setItem(i, j, QTableWidgetItem(self.note_df.iloc[i, j]))
        self.noteTable.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        QMessageBox.about(self, '알림', '오답 노트를 표시할게요')

# 단어 숨기기 기능
    def hide_note(self):
        self.noteTable.setRowCount(0)
        self.noteTable.setColumnCount(2)
        QMessageBox.about(self, '알림', '단어 목록을 숨길게요')


# 그래프 보기/숨기기 버튼
    def graph_button(self):
        if self.graph_present == 1:
            self.hide_graph()
        elif self.graph_present == 0:
            self.show_graph()

# 정답률 그래프 표시 기능
    def show_graph(self):
        if self.score == 0 and self.note_df.shape[0] == 0:
            QMessageBox.about(self, '알림', '아직 한 문제도 풀지 않았어요')
        else:
            self.plotWidget.canvas.axes.clear()
            self.plotWidget.canvas.axes.pie([float(self.score), float(self.note_df.shape[0])], labels=['O','X'], colors=['#99ff99','#ff6666'], autopct='%.1f%%', startangle=90)
            self.plotWidget.canvas.draw()
            self.graphButton.setText('그래프\n숨기기')
            self.graph_present = 1

# 그래프 숨기기 기능
    def hide_graph(self):
        self.plotWidget.canvas.axes.clear()
        self.plotWidget.canvas.axes.pie([1], colors=['#ffffff'])
        self.plotWidget.canvas.draw()
        self.graphButton.setText('그래프\n표시하기')
        self.graph_present = 0

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = MyWindow()
    myWindow.show()
    app.exec_()
728x90
반응형