본문 바로가기

코딩/업무자동화

[파이썬/업무자동화] PyQt5 콤보박스 응용 - 엑셀 시트 리스트를 콤보박스화하기

반응형

※ PyQt5 관련 포스팅

1편 : 2021.03.06 - [Python/파이썬] PyQT5 및 QT Designer 소개, .ui 파일 .py로 변환 방법

2편 : 2021.03.28 - [Python/파이썬] PyQt5를 통한 GUI 구성 및 사용법 이해하기

3편 : 2021.03.29 - [Python/파이썬] PyQt5 사용시 필요한 쓰레드 개념 이해 : 파이썬 GUI 응답없음 해결 방법 - 1

4편 : 2021.03.30 - [Python/파이썬] PyQt5 사용시 필요한 쓰레드 개념 이해 : 파이썬 GUI 응답없음 해결 방법 - 2

5편 : 2021.07.07 - [파이썬/업무자동화] PyQt5 콤보박스 응용 - 엑셀 시트 리스트를 콤보박스화하기

 


 

  파이썬으로 사용자가 손쉽게 사용할 수 있도록 GUI로 만드려면 PyQt5를 잘 응용해야 한다. 이 전에 PyQt에 대한 포스팅을 진행한바 있으나 실제 어떻게 응용될지에 대한 내용을 써본적은 없다. 이번 포스팅에서는 내가 실제로 업무 자동화 프로그램을 작성할 때 PyQt를 어떤 방식으로 활용하는지에 대한 내용을 포스팅하려 한다.

 

  그 중 하나는 엑셀파일을 읽어와서 엑셀파일의 경로를 GUI에 출력하고 엑셀의 시트명을 콤보박스에 출력하는 것이다. 아래 이미지를 보면 어떤 부분인지 확인할 수 있다.

 

 

 

 

  선택한 엑셀파일인 "exceltest.xlsx" 파일에는 아래와 같이 3개 시트가 존재한다.(투손플레이스1,2,3) 위 GUI는 엑셀파일을 선택하면 콤보박스에 시트명을 리스화해서 선택할 수 있게 해준다.

 

 

exceltest.xlsx

 

 

  이 기능을 활용하면 엑셀의 특정 시트 내용을 GUI를 통해 읽어올 수 있다. 작성한 코드를 통해 방법을 순서대로 정리해보자. 전체코드는 하단에 있음.

 

 

 

1. UI 구성

 

  test를 위해 UI는 아래 이미지처럼 3가지로 구성하였다. ObjectName은 표시 된 바와 같고 코드에서는 각 ObjectName으로 접근할 것이다. ui파일의 파일명은 "test.ui"이다. 해당 ui는 QT designer를 통해 만들었다.

 

  UI 구성 및 Object에 대한 내용은 이전 포스팅에서도 설명한 바 있으므로 관련 링크로 대체하도록 한다. 링크의 글을 읽어보면 UI와 코드 구성관계에 대한 내용을 이해할 수 있다.

 

참고링크 : 2021.03.28 - [코딩/Python] - [Python/파이썬] PyQt5를 통한 GUI 구성 및 사용법 이해하기

 

ObjectName 설정

 

 

사용 Class

 

 

 

2. 코드 설명

 

 

1) 사용 모듈 및 ui 파일 import

 

   import 한 모듈은 크게 4가지이다. 위 UI에서 사용한 QComboBox, QLineEdit, QPushButton은 PyQt5의 QTWidgets 클래스에 속해 있다. 엑셀의 시트명을 읽어오기 위해 openpyxl 모듈을 사용하였다.

 

  위 QT designer의 .ui 파일을 읽어오려면 uic 모듈을 import 해야 한다.

 

 

<코드>

import sys
import openpyxl as op
from PyQt5.QtWidgets import *
from PyQt5 import uic

form_class = uic.loadUiType("./Project/pyqt_practice/test.ui")[0]

 

 

 

2) UI Class 및 초기화 메서드 정의

 

 

  UI의 클래스 정의 및 초기화 메서드를 정의한 부분이다. 해당 Class는 QMainWindow와 form_class를 다중상속받는다. 이 부분은 class를 알지 못하면 이해하기 어려울 수 있다. 과거에 class 관련 포스팅을 했어서 이전글을 참고하면 좋을 것 같다.

 


※ Class(클래스) 관련 포스팅

2021.03.14 - [Python/파이썬] Class(클래스) 기초 정리 - 1 : 개념, 사용법

2021.03.20 - [Python/파이썬] Class(클래스) 기초 정리 - 2 : has-a 관계, 상속 개념

2021.03.21 - [Python/파이썬] Class(클래스) 기초 정리 - 3 : 다중상속, super().__init__(), 메서드 오버라이딩

2021.03.22 - [Python/파이썬] Class(클래스) 기초 정리 - 4 : 추상 클래스, 클래스 변수

 


 

class를 이해한 후 주석을 통해 코드 구성을 이해해보도록 하자.

 

 

<코드>

#Qtwidgets의 QMainWindow, ui파일의 form_class 상속
class WindowClass(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self) #UI Setup

        #fileSelect 버튼 클릭시 selectFunction 메서드 동작   
        self.fileSelect.clicked.connect(self.selectFunction)
        
        #comboBox의 내용 변경시 printShtname 메서드 동작
        self.comboBox.currentIndexChanged.connect(self.printShtname)

 

 

-. self.fileSelect.clcked.connect(self.selectFunction)

  : 위 UI를 보면 fileSelect라는 object가 있다. 이 버튼을 클릭하면 클래스의 selectFunction이라는 메서드가 동작한다.

 

 

-. self.comboBox.currentIndexChanged.connect(self.printShtname)

  : 위 UI를 보면 comboBox라는 object가 있다. 콤보박스의 내용이 변경되면 클래스의 printShtname 메서드가 동작한다.

 

 

 

3) 클래스 동작 메서드 정의

 

 

  위 코드에서 selectFunction과 printShtname에 대한 메서드를 정의한 부분이다. 주석을 각 줄마다 달아놓았으니 설명은 따로 생략하도록 한다. 각 object에 대한 함수 내용은 아래 참고링크를 통해 찾아볼 수 있다.

 

 

<코드>

 #selectFunction 메서드 정의
    def selectFunction(self):

        #filePath 출력하는 부분 초기화
        self.filePath.clear()
        #comboBox 출력하는 부분 초기화
        self.comboBox.clear()
        #선택한 엑셀 파일 경로를 받아옴 : 튜플 타입으로 받아오며 0번재 요소가 주소값 string이다.
        path = QFileDialog.getOpenFileName(self, 'Open File', '', 'All File(*);; xlsx File(*.xlsx)')
        #filePath에 현재 읽어온 엑셀 파일 경로를 입력한다.(절대경로)
        self.filePath.setText(path[0])

        #위 절대 경로 활용해 openpyxl workbook 객체 생성
        wb = op.load_workbook(path[0])
        #설정한 workbook의 시트리스트를 읽어온다.
        self.shtlist = wb.sheetnames
        print(self.shtlist)
        
        #시트리스트를 반복문으로 진행
        for sht in self.shtlist:
            #콤보박스의 addItem을 사용하여 항목 추가(addItem의 요소는 문자열 타입)
            self.comboBox.addItem(sht)
     
    #콤보박스의 내용 변경시 터미널에 시트명 출력
    def printShtname(self):
        print(self.comboBox.currentText())

 

 

4) 실행 결과

 

 

  콤보박스를 선택시 아래 터미널 창에 선택한 시트명을 출력한다. 위 내용을 응용하면 GUI를 통해 각 시트의 내용을 읽고 쓰는 것도 가능하다.

 

 

 

 

3. 전체코드 및 파일

 

<전체 코드>

import sys
import openpyxl as op
from PyQt5.QtWidgets import *
from PyQt5 import uic

form_class = uic.loadUiType("./Project/pyqt_practice/test.ui")[0]

#Qtwidgets의 QMainWindow, ui파일의 form_class 상속
class WindowClass(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self) #UI Setup

        #fileSelect 버튼 클릭시 selectFunction 메서드 동작   
        self.fileSelect.clicked.connect(self.selectFunction)
        
        #comboBox의 내용 변경시 printShtname 메서드 동작
        self.comboBox.currentIndexChanged.connect(self.printShtname)

    #selectFunction 메서드 정의
    def selectFunction(self):

        #filePath 출력하는 부분 초기화
        self.filePath.clear()
        #comboBox 출력하는 부분 초기화
        self.comboBox.clear()
        #선택한 엑셀 파일 경로를 받아옴 : 튜플 타입으로 받아오며 0번재 요소가 주소값 string이다.
        path = QFileDialog.getOpenFileName(self, 'Open File', '', 'All File(*);; xlsx File(*.xlsx)')
        #filePath에 현재 읽어온 엑셀 파일 경로를 입력한다.(절대경로)
        self.filePath.setText(path[0])

        #위 절대 경로 활용해 openpyxl workbook 객체 생성
        wb = op.load_workbook(path[0])
        #설정한 workbook의 시트리스트를 읽어온다.
        self.shtlist = wb.sheetnames
        print(self.shtlist)
        
        #시트리스트를 반복문으로 진행
        for sht in self.shtlist:
            #콤보박스의 addItem을 사용하여 항목 추가(addItem의 요소는 문자열 타입)
            self.comboBox.addItem(sht)
     
    #콤보박스의 내용 변경시 터미널에 시트명 출력
    def printShtname(self):
        print(self.comboBox.currentText())


#GUI 출력 부분
if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = WindowClass()
    myWindow.show()
    app.exec_()

 

 

<.ui 파일 및 .py파일>

comboBox_practice.zip
0.00MB


참고링크 : https://wikidocs.net/35493

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

728x90