주제: PyQt6로 쉽게 GUI 만들기 - 코드 포함
작성: 2023-10-24
수정: 2023-10-29
해당 포스팅은 "PyQt6로 쉽게 GUI 만들기" 시리즈의 3번째 글입니다.
🖥️ PyQt6로 쉽게 GUI 만들기
1. 구조 이해 - 2023.10.24 - [✔ Python/4. GUI Programming] - [PyQt6] 기본적인 구조부터 이해하기
2. 코드 구현 - 2023.10.25 - [✔ Python/4. GUI Programming] - [PyQt6] QListWidget 활용한 GUI 구현[1/2] (코드 포함)
3. 코드 개선 - 2023.10.24 - [✔ Python/4. GUI Programming] - [PyQt6] QListWidget 활용한 GUI구현 [2/2] (코드 포함)
4. 테마 적용 - 2023.10.25 - [✔ Python/4. GUI Programming] - [PyQt6] GUI Stylesheet Theme 적용하기 : qt_material
이제 거의 다왔습니다. 최종적인 GUI화면은 다음과 같습니다.
아래의 GIF에서 확인할 수 있듯이 수강생을 클릭하면, 해당 학생의 3개의 과목점수가 표출되는 형태입니다.
1. 코드 개선
다양한 환경에서도 제약조건 없이 코드를 사용하기 위해 일부 코드를 변경하도록 하겠습니다.
1-1. 코드의 범용성
기존 코드에서 열의 수를 하드코딩으로 설정하여 당시 필요한 만큼인 3으로 설정하였습니다. 하지만, 데이터가 변경되면 이를 일일이 수정해야 하는 번거로움이 있습니다. 그래서 데이터프레임의 열 수를 기반으로 설정하여 코드의 범용성을 높여보겠습니다.
<기존>
self.table_widget = QTableWidget()
self.table_widget.setColumnCount(3) # 기존
layout.addWidget(QLabel("🧑🏻💻 WSCODE 수강생을 선택하시오"))
layout.addWidget(self.table_widget)
<변경>
self.table_widget = QTableWidget()
self.table_widget.setColumnCount(self.df.shape[1]) # 변경
layout.addWidget(CustomLabel("📋 수강생 성적관리 "))
layout.addWidget(self.table_widget)
1-2. 중복코드 제거
기존 코드에서 QLabel 폰트크기 및 볼드(Bold)를 중복으로 설정하는 부분이 있었습니다. 그래서 "CustomLabel" 클래스를 생성하여 중복되는 코드를 최소화해 보도록 하겠습니다.
<기존>
def initUi(self) :
self.setWindowTitle("수강생 성적정보 관리 어플리케이션")
self.setGeometry(300,300,500,300)
layout = self.layout
label = QLabel("🧑🏻💻 수강생 이름")
font = label.font()
font.setPointSize(18)
font.setBold(True)
layout.addWidget(label)
<변경>
class CustomLabel(QLabel):
def __init__(self, text, font_size=15):
super().__init__(text)
font = QFont()
font.setPointSize(font_size)
self.setFont(font)
def initUi(self) :
self.setWindowTitle("수강생 성적정보 관리 어플리케이션")
self.setGeometry(300,300,500,300)
layout = self.layout
layout.addWidget(CustomLabel("🧑🏻💻 수강생 이름 "))
1-3. 사용자 친화적인 코드
종종 원본 데이터와 달리, 사용자 친화적으로 데이터를 제공해야할 때가 있습니다. 이런 경우, 테이블 위젯의 HeaderLabels을 변경하여 사용자에게 더 의미있는 정보를 제공할 수 있습니다.
layout.addWidget(CustomLabel("📋 수강생 성적관리 "))
self.table_widget.setHorizontalHeaderLabels(["학생명", "설계 과목점수","코딩 과목점수","해석 과목점수"])
2. 전체코드
코드 하단의 if __name__ == '__main__': 에서 임의의 데이터값을 적어서 표출하였으나, 기존의 데이터파일이 있는 경우, 업로드하여 사용이 가능합니다. 예를 들어, csv파일의 경우, df = pd.read_csv('./파일명. csv')과 같은 방식으로 적용할 수 있습니다.
import sys
import pandas as pd
from PyQt6.QtGui import QFont
from PyQt6.QtWidgets import (QApplication, QMainWindow,QVBoxLayout, QWidget,
QLabel,QListWidget, QAbstractItemView, QTableWidgetItem,
QTableWidget, QHBoxLayout)
# QLabel 폰트설정 클래스
class CustomLabel(QLabel):
def __init__(self, text, font_size=15):
super().__init__(text)
font = QFont()
font.setPointSize(font_size)
self.setFont(font)
class MyApp(QMainWindow):
def __init__(self, df):
super().__init__()
self.layout = QVBoxLayout()
self.df = df
self.initUi()
def initUi(self) :
self.setWindowTitle("수강생 성적정보 관리 어플리케이션")
self.setGeometry(300,300,500,300)
layout = self.layout
layout.addWidget(CustomLabel("🧑🏻💻 수강생 이름 "))
## QList 생성
self.name_listwidget = QListWidget()
self.name_listwidget.addItems(sorted(self.df['이름']))
self.name_listwidget.setSelectionMode(QAbstractItemView.SelectionMode.MultiSelection)
self.name_listwidget.itemSelectionChanged.connect(self.update_table)
layout.addWidget(self.name_listwidget)
## QTableWidget 생성
self.table_widget = QTableWidget()
self.table_widget.setColumnCount(self.df.shape[1])
layout.addWidget(CustomLabel("📋 수강생 성적관리 "))
# self.table_widget.setHorizontalHeaderLabels(["학생명", "설계과목","코딩과목","해석과목"])
layout.addWidget(self.table_widget)
widget = QWidget()
widget.setLayout(layout)
self.setCentralWidget(widget)
def update_table(self):
## 초기 테이블 설정값
self.table_widget.setRowCount(0)
## 선택된 라벨값 추출
selected_items = self.name_listwidget.selectedItems()
## 테이블의 열 수를 데이터프레임의 열 수에 맞추기
num_columns = self.df.shape[1]
self.table_widget.setColumnCount(num_columns)
self.table_widget.setHorizontalHeaderLabels(self.df.columns)
## 테이블의 행 수를 선택한 항목 수로 설정
num_rows = len(selected_items)
self.table_widget.setRowCount(num_rows)
for row, item in enumerate(selected_items):
name = item.text()
row_data = self.df[self.df['이름'] == name]
for col in range(num_columns):
data = row_data.iloc[0, col]
print(data)
self.table_widget.setItem(row, col, QTableWidgetItem(str(data)))
if __name__ == '__main__':
# 데이터 경로
data = {'이름': ['루카스', '오드리', '라트리스','커스틴'],
'설계': [80, 90, 85, 100],
'코딩': [100, 50, 85, 100],
'해석': [95,90,95, 100]}
df = pd.DataFrame(data)
app = QApplication(sys.argv)
window = MyApp(df)
window.show()
app.exec()
코드개선을 통해서 코드가 더 모듈화되어 코드의 유지보수 및 확장에 용이해집니다.
3. 다음 포스팅에서는...?
간단하게 스타일/테마를 지정하는 방법을 알아보도록 하겠습니다.
해당 포스팅은 "PyQt6로 쉽게 GUI 만들기" 시리즈의 3번째 글입니다.
🖥️ PyQt6로 쉽게 GUI 만들기
1. 구조 이해 - 2023.10.24 - [✔ Python/4. GUI Programming] - [PyQt6] 기본적인 구조부터 이해하기
2. 코드 구현 - 2023.10.25 - [✔ Python/4. GUI Programming] - [PyQt6] QListWidget 활용한 GUI 구현[1/2] (코드 포함)
3. 코드 개선 - 2023.10.24 - [✔ Python/4. GUI Programming] - [PyQt6] QListWidget 활용한 GUI구현 [2/2] (코드 포함)
4. 테마 적용 - 2023.10.25 - [✔ Python/4. GUI Programming] - [PyQt6] GUI Stylesheet Theme 적용하기 : qt_material
'Python > 3️⃣ 프로그래밍' 카테고리의 다른 글
[PyQt6] 다양한 위젯(Qwidget) 적용하기 (11) | 2024.01.14 |
---|---|
[PyQt6] GUI Stylesheet Theme 적용하기 : qt_material (6) | 2023.10.29 |
[PyQt6] QListWidget 활용한 GUI 구현[1/2] (코드 포함) (0) | 2023.10.25 |
[PyQt6] 기본적인 구조부터 이해하기 (3) | 2023.10.24 |
QtWidegets 모듈 vs QtWidegets 클래스 (0) | 2023.10.23 |