Timpossible history

[Python] PyQt5로 응용프로그램 만들기(Feat. Pyinstaller) 본문

Python

[Python] PyQt5로 응용프로그램 만들기(Feat. Pyinstaller)

팀파서블 2024. 2. 28. 02:04

Python을 실행시키려면 가상환경을 만들고 그 안에서 코드를 실행시킬 수 있는 환경들을 만들어야 하는데, 파이썬이 설치되어 있지 않거나 파이썬 소스코드를 돌릴 수 있는 환경이 갖추어져 있지 않은 상태에서도 실행시킬 수 있게 도와주는 것이 .exec, .app(맥OS)나 .exe(Windows) 확장자 이름을 갖는 응용프로그램이라고 할 수 있다.

 

파이썬 라이브러리 중에서는 이러한 응용 프로그램을 만들 수 있도록 도와 주는 라이브러리가 많지만 대표적으로 Tkinter나 PyQt5가 있다. Tkinter는 잘 알 것이고, 이 포스트에서는 PyQt5를 이용해서 프로젝트를 진행하도록 하겠다

 

1. 프로젝트 시작

python3 -m venv exe_maker

 먼저 가상환경을 만들어주는 코드를 실행해준다. exe_maker라는 이름으로 프로젝트를 시작한다.

cd exe_maker
source bin/activate

 

2. 라이브러리 설치

 

필요한 라이브러리를 설치해준다

pip3 install PyQt5 openpyxl pyinstaller

 

openpyxl은 지금 만들어보려고 하는 응용프로그램이 엑셀 파일의 정보를 읽는 간단한 파일을 만들어보기 위함이다.

 

여기서 알아두어야 할 점은 현재 설치된 라이브러리는 가상환경의 path에 맞게 설치되어 모듈이 저장되어 있기 때문에, 후에 .exe 응용 프로그램 파일을 빌드할 때에는 module path 처리를 잘 해주어야 한다. 근데 본인은 그냥 가상환경이 아니라 python3.xx path에 맞춰서 라이브러리를 다시 설치해버렸다. 그게 더 간편했기 때문...

Pyinstaller에 대해서는 아래에서 설명

 

3. 소스 코드

 

# main.py

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QListWidget, QFileDialog, QTextEdit
from openpyxl import load_workbook

class ExcelApp(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Excel App')
        self.setGeometry(100, 100, 400, 300)

        layout = QVBoxLayout()

        self.file_list = QListWidget()
        layout.addWidget(self.file_list)

        add_file_button = QPushButton('Add Excel File(s)')
        add_file_button.clicked.connect(self.add_files)
        layout.addWidget(add_file_button)

        process_button = QPushButton('Process Excel Files')
        process_button.clicked.connect(self.process_files)
        layout.addWidget(process_button)

        self.output_text = QTextEdit()
        layout.addWidget(self.output_text)

        self.setLayout(layout)

    def add_files(self):
        file_dialog = QFileDialog()
        file_dialog.setFileMode(QFileDialog.ExistingFiles)
        file_dialog.setNameFilter('Excel Files (*.xls *.xlsx)')
        if file_dialog.exec_():
            file_paths = file_dialog.selectedFiles()
            for file_path in file_paths:
                self.file_list.addItem(file_path)

    def process_files(self):
        output_text = ''
        for i in range(self.file_list.count()):
            file_path = self.file_list.item(i).text()
            output_text += f'Reading data from {file_path}...\n'
            try:
                wb_original = load_workbook(file_path)
                ws_original = wb_original.active
               # 이곳에서 엑셀의 정보를 갖고 하고 싶은 작업을 하면 된다.
              
                output_text += f'{file_path} processed successfully.\n'
            except Exception as e:
                output_text += f'Error processing {file_path}: {str(e)}\n'
        self.output_text.setPlainText(output_text)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    excel_app = ExcelApp()
    excel_app.show()
    sys.exit(app.exec_())

 

class Excel 안에 응용 프로그램의 GUI를 위해 무엇을 배치시킬 것인지 적어준다. QVBoxLayout()을 통해서 전체적인 layout을 만들어주고 그 위에 여러 widget을 렌더링 해줄 것이다.

먼저 선택된 엑셀 파일들을 리스트로 보여주기 위한 widget을 만들어주고, 그 아래에는 버튼을 두 개 수직 방향으로 배치 시킬 것이다. 한 버튼은 파일 선택 버튼이며, 다른 버튼은 정해진 함수를 실행할 버튼이라고 보면 된다.

그리고 그 버튼들 아래에는 결과물의 문자열 텍스트를 보여주는 widget을 만들어준다.

다음 커맨드라인을 실행하여 코드를 실행해본다.

python3 main.py

 

간단한 결과물의 모습은 이렇다.

대충 잘 실행이 되었다. 그리고 다수의 엑셀 파일을 선택해서 작업을 실행해보자.

 

실행이 잘 되었다는 것을 하단의 widget에 렌더링된 텍스트를 통하여 알수 있다.

 

3. .exec 응용 프로그램으로 설치

PyQt5 라이브러리는 응용 프로그램의 GUI를 구현해내는 것이고 응용 프로그램을 설치하려면 Pyinstaller를 이용한다.

 

방법은 간단하다. 여러 옵션들이 있기도 하니 이것은 pyinstaller 라이브러리 공식 Docs를 참고하면 좋을 것 같다.

 

참고 : https://pyinstaller.org/en/v4.8/usage.html

 

Using PyInstaller — PyInstaller 4.8 documentation

Making GNU/Linux Apps Forward-Compatible Under GNU/Linux, PyInstaller does not bundle libc (the C standard library, usually glibc, the Gnu version) with the app. Instead, the app expects to link dynamically to the libc from the local OS where it runs. The

pyinstaller.org

 

간단하게 아무 옵션 없이 .exec 파일을 생성하려면, 아래의 커맨드라인을 실행해준다.

pyinstaller main.py

 

이와 같이 실행해준다면 루트 폴더 안에 dist라는 폴더가 생기며 그 안에 여러 파일을 포함해서 main이라는 이름의 .exec 파일이 생성이 된다.

그러나 여기서 응용프로그램 파일만을 원한다면, --onefile 또는 -F argument를 붙여주면 되고, 응용프로그램 실행 시 실행 로그들을 보여주는 콘솔창을 보이지 않게하려면, --noconsole 또는 -w argument를 붙여주면 된다. 다음과 같다.

pyinstaller -F -w main.py

 

이와 같이 실행해주면 똑같이 dist 폴더 안에 main.exe( or main.exec) 실행 파일 하나만 생성된다.

'Python' 카테고리의 다른 글

[파이썬] 카카오톡 메세지 자동으로 보내기  (0) 2024.01.23