※ 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는 엑셀파일을 선택하면 콤보박스에 시트명을 리스화해서 선택할 수 있게 해준다.
이 기능을 활용하면 엑셀의 특정 시트 내용을 GUI를 통해 읽어올 수 있다. 작성한 코드를 통해 방법을 순서대로 정리해보자. 전체코드는 하단에 있음.
1. UI 구성
test를 위해 UI는 아래 이미지처럼 3가지로 구성하였다. ObjectName은 표시 된 바와 같고 코드에서는 각 ObjectName으로 접근할 것이다. ui파일의 파일명은 "test.ui"이다. 해당 ui는 QT designer를 통해 만들었다.
UI 구성 및 Object에 대한 내용은 이전 포스팅에서도 설명한 바 있으므로 관련 링크로 대체하도록 한다. 링크의 글을 읽어보면 UI와 코드 구성관계에 대한 내용을 이해할 수 있다.
참고링크 : 2021.03.28 - [코딩/Python] - [Python/파이썬] PyQt5를 통한 GUI 구성 및 사용법 이해하기
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파일>
참고링크 : https://wikidocs.net/35493
위키독스
온라인 책을 제작 공유하는 플랫폼 서비스
wikidocs.net
'코딩 > 업무자동화' 카테고리의 다른 글
[파이썬/업무자동화] 엑셀 전체 셀 내용 중 특정 문자만 변경/제거하기 (2) | 2021.07.27 |
---|---|
[파이썬/업무자동화] 같은 양식 여러 엑셀 파일에서 필요한 값만 가져오기 (0) | 2021.07.26 |
[파이썬/업무자동화] 파일명 규칙 따라 폴더 자동 분류하기 (8) | 2021.07.05 |
[파이썬/업무자동화] 엑셀 데이터를 종류별 자동 분류하기 (13) | 2021.07.02 |
[파이썬/업무자동화] 여러 엑셀 파일의 모든 시트 하이퍼링크 걸기 (1) | 2021.06.23 |