해당 프로그램은 Qt Designer를 이용하지 않고, 코드 상에서 label을 생성하여 구성했다. (이유는,, Qt Designer로 했을 때, 사진이 있는 경우에만 폼의 크기를 동적으로 바꿔주려 했는데 코드로 구현하는게 더 쉬웠다..)
문제 맞추기 파이썬 코드
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPixmap
class Quiz(QMainWindow):
def __init__(self):
super().__init__()
# 문제와 선택지들 리스트로 관리
self.questions = [
{
'question': "다음 사람의 이름은 무엇일까요?",
'choices': [
"홍길동",
"이블린",
"뽀로로",
"이예준",
"케로로"
],
'correct_choice': "이예준",
'image_path': "yejun.jpg" # 이미지 파일 경로
},
{
'question': "1번 문항에서 선택한 사람의 전공은 무엇일까요?",
'choices': [
"정보보호학전공",
"체육교육학전공",
"경영학전공",
"회계학전공",
"소프트웨어학전공"
],
'correct_choice': "정보보호학전공"
},
# 다른 문제들 추가
]
self.setWindowTitle("문제 맞추기 게임")
self.setGeometry(500, 300, 600, 700)
# 메인 위젯과 레이아웃 생성
self.main_widget = QWidget(self)
self.layout = QVBoxLayout(self.main_widget)
# 문제 라벨
self.label_question = QLabel()
self.layout.addWidget(self.label_question)
# 이미지 표시 라벨
self.label_image = QLabel(self)
self.label_image.setScaledContents(True) # 이미지를 가로 너비에 맞게 자동 조정
self.label_image.setMaximumSize(300, 16777215) # 최대 크기 설정
self.layout.addWidget(self.label_image)
# 선택지 라디오 버튼
self.radio_buttons = []
for _ in range(len(self.questions[0]['choices'])):
radio_button = QRadioButton()
self.layout.addWidget(radio_button)
self.radio_buttons.append(radio_button)
# 소개 라벨
self.label_profile = QLabel()
self.layout.addWidget(self.label_profile)
# 제출 버튼
self.submit_button = QPushButton("제출", self)
self.submit_button.clicked.connect(self.check_answer)
self.layout.addWidget(self.submit_button)
# 메인 위젯 설정
self.setCentralWidget(self.main_widget)
# 문제 인덱스 초기화
self.current_question_index = 0
self.set_question()
def set_question(self):
current_question = self.questions[self.current_question_index]
self.label_question.setText(current_question['question'])
self.label_profile.hide()
# 이미지 로드 및 표시
image_path = current_question.get('image_path')
if image_path:
pixmap = QPixmap(image_path)
self.label_image.setPixmap(pixmap)
self.label_image.setScaledContents(True)
self.label_image.show() # 이미지가 있는 경우 이미지 라벨을 표시
else:
self.label_image.hide() # 이미지가 없는 경우 이미지 라벨을 숨김
# 윈도우 크기 조정
question_length = len(current_question['question'])
if image_path:
window_height = 400 + question_length * 10
else:
window_height = 50 + question_length * 10
self.setFixedSize(400, window_height)
for i, choice in enumerate(current_question['choices']):
self.radio_buttons[i].setText(choice)
def set_profile(self):
self.label_question.setText('나의 소개')
pixmap = QPixmap('yejun.jpg')
self.label_image.setPixmap(pixmap)
self.label_image.setScaledContents(True) # 이미지를 가로 너비에 맞게 자동 조정
self.label_image.setMaximumSize(300, 16777215) # 최대 크기 설정
self.label_image.show() # 이미지가 있는 경우 이미지 라벨을 표시
self.setFixedSize(400, 500)
self.label_profile.show()
self.label_profile.setText('이름 : 이예준 \n전공 : 정보보호학전공 \n\n만나서 반가워요~')
for radio_button in self.radio_buttons:
radio_button.hide()
self.submit_button.hide()
self.close_button = QPushButton("종료", self)
self.close_button.clicked.connect(self.close)
self.layout.addWidget(self.close_button)
def check_answer(self):
selected_choice = None
for radio_button in self.radio_buttons:
if radio_button.isChecked():
selected_choice = radio_button.text()
break
if selected_choice is None:
QMessageBox.warning(self, "경고", "답을 선택해주세요.")
else:
current_question = self.questions[self.current_question_index]
if selected_choice == current_question['correct_choice']:
QMessageBox.information(self, "정답", "정답입니다!")
else:
QMessageBox.information(self, "오답", "오답입니다.")
return
# 다음 문제로 이동하거나 게임 종료
self.current_question_index += 1
if self.current_question_index < len(self.questions):
self.set_question()
else:
QMessageBox.information(self, "게임 종료", "모든 문제를 푸셨습니다.")
self.set_profile()
def close(self):
self.close()
app = QApplication(sys.argv)
window = Quiz()
window.show()
sys.exit(app.exec_())
코드 상에서 이미지를 불러오는데, 이때 같은 경로에 있는 이미지 이름을 하드코딩 해주었다.
이 코드 상에서 첫번째 문제의 사진을 띄우기 위해서는 같은 경로의 yejun.jpg 파일을 불러오게 된다.
실행 결과 화면
왼쪽 사진과 같이 그림이 뜨고, 이름을 맞추면, 정답이라는 메시지 창과 함께 다음 문제로 넘어간다.
두번째 문제에서는 사진을 사용하지 않아서 폼의 크기가 줄어들었고, 오답이라는 메시지와 함께 다시 문제를 맞출 기회를 제공한다.
문제를 맞추면 첫번째 문제와 동일하게 정답 메시지 창이 뜨고, 모든 문제를 풀었다는 메시지 창이 연속으로 뜬다. 하지만, 마지막으로 나의 정보를 한번에 정리하는 창이 있으면 좋겠다고 생각이 들어서 마지막에 프로필을 띄워주는 코드를 추가했다.
파이썬 PyQt5 모듈을 이용하여 간단한 나만의 문제를 제작하고, 마지막에는 이를 종합하여 나를 소개하는 코드를 작성했다. 단순히 콘솔로만 나타내는 프로그램이 아닌, 이와 같이 GUI로 나타내게 되면, 코딩을 잘 모르는 사람들도 한눈에 잘 이해할 수 있다. 보는 사람들에게 편의성을 제공하는 PyQt5를 한번쯤은 다뤄보는 것도 좋은 경험인 것 같다.
Uploaded by N2T