✔ Python/4. GUI Programming

[PyQt6] QListWidget 활용한 GUI구현 [2/2] (코드 포함)

  • -
주제: 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개의 과목점수가 표출되는 형태입니다.

최종 GUI 화면(.GIF)

다양한 환경에서도 제약조건 없이 코드를 사용하기 위해 일부 코드를 변경하도록 하겠습니다.

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(["학생명", "설계 과목점수","코딩 과목점수","해석 과목점수"])

 

코드 하단의 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()

코드개선을 통해서 코드가 더 모듈화되어 코드의 유지보수 및 확장에 용이해집니다.

간단하게 스타일/테마를 지정하는 방법을 알아보도록 하겠습니다.


해당 포스팅은 "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 

 

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.