[PyQt5] Python을 위한 GUI 라이브러리
1. Layout
: 어플리케이션 창 위에 위젯을 배치하는 방식
1.1 Absolute positioning
각 위젯의 위치와 크기를 픽셀 단위로 설정해 배치
- 창의 크기를 조절해도 위젯의 크기/위치는 변하지 않아
- 플랫폼에 따라 어플리케이션이 다르게 보일 수 있어
- 폰트 변경 시 레이아웃 망가질 수 있다
=> 레이아웃 변경 시 완전히 새로 고쳐야 하므로 매우 번거로움..
1.2 Box layout
QHBoxLayout, QVBoxLayout은 여러 위젯을 수평, 수직으로 정렬하는 레이아웃 클래스
각 생성자는 수평, 수직의 박스를 하나 만들어 <- 다른 레이아웃 박스 or 위젯 배치
addStretch() - 필요한 공간 만들고, stretch factor 조절
vbox = QVBoxLayout()
vbox.addStretch(3)
vbox.addLayout(hbox)
vbox.addStretch(1)
1.3 Grid layout
grid = QGridLayout()
self.setLayout(grid)
QGridLaoyout을 만들고, 어플리케이션 창의 레이아웃으로 설정한다.
grid.addWidget(QLabel('Title:'), 0, 0) # 추가할 위젯, 행, 열
grid.addWidget(QLabel('Author:'), 1, 0)
grid.addWidget(QLabel('Review:'), 2, 0)
Layout 중첩
2. Widget
어플리케이션을 이루는 기본 구성 요소, PyQt 툴킷에서 다양한 위젯을 제공한다.
+ 둘러보기
3. Dialog
사용자가 데이터를 입력, 수정, 어플리케이션 설정 변경하는 작업하는데 사용 (대화창)
+ 둘러보기
4. Signal / Slot
PyQt에서 이벤트(=signal) 처리 할 때 사용되는 함수, 이벤트 핸들러를 슬롯이라고 한다.
사용자 정의 시그널
class Communicate(QObject):
closeApp = pyqtSignal()
Communicate class 속성으로 closeApp 시그널을 생성한다.
class MyApp(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.c = Communicate()
self.c.closeApp.connect(self.close)
self.setWindowTitle('Emitting Signal')
self.setGeometry(300, 300, 300, 200)
self.show()
def mousePressEvent(self, e):
self.c.closeApp.emit()
MyApp 클래스의 close() 슬롯에 연결되고 mousePressEvent 핸들러를 사용해, 마우스 클릭 시 closeApp 시그널이 동작
4. PyQTt5 그림 그리기
QPainter 클래스는 GUI 프로그램에 필요한 '그리기'와 관련된 기능을 제공한다.
QPainter 의 동작은 일반적으로 위젯의 페인트 이벤트를 통해 이루어진다.
5. 실행파일 만들기 (PyInstaller)
PyInstaller 를 이용해 python과 pyQt로 제작한 GUI 프로그램을 실행파일(exe)로 만들 수 있다.
1. Pyinstaller 패키지 설치
pip install pyinstaller
2. python 파일이 있는 폴더로 이동 후, 아래 명령어로 해당 폴더에 실행 파일 생성
pyinstaller (-w | -F) file_name.py
콘솔창이 출력되지 않게 하려면 -w 또는 -windowed 옵션을 추가한다
실행 파일 하나만 생성하기 위해서는 -F 또는 -onefile 옵션을 추가한다