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
반응형
'데이터 분석 > 파이썬' 카테고리의 다른 글
롤 API 활용 예시(LEAGUE-V4, MATCH-V5) (2) | 2022.06.29 |
---|---|
파이썬으로 간단한 자판기 만들기 (0) | 2022.04.28 |