해당 글은 <PyQt5 Tutorial - 파이썬으로 만드는 나만의 GUI 프로그램>을 공부한 내용을 바탕으로 하며, 자세한 내용 및 소스코드는 하단 링크를 참조한다.
import sys
from PyQt5.QtWidgets import QApplication, QWidget
class MyApplication(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Application Title')
#창의 제목표시줄에 나타날 제목
self.move(300, 300)
#스크린 상에서 위젯이 나타날 위치(x방향[px], y방향[px])
self.resize(400, 200)
#위젯의 크기 (너비[px], 높이[px])
self.show()
#위젯을 화면에 띄움
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApplication()
sys.exit(app.exec_())
1) PyQt5.QtWidgets
: 기본적 UI 구성요소 제공 클래스가 포함된 모듈
2) PyQt5 어플리케이션은 어플리케이션 객체를 생성해야 하므로 QApplication
클래스의 변수를 할당
def center(self):
window_info = self.frameGeometry() #창의 위치와 크기 정보 받음
center_loc = QDesktopWidget().availableGeometry().center()
#사용자의 모니터 가운데 위치 파악
window_info.moveCenter(center_loc) #중심 위치를 지정한 곳으로 이동
self.move(window_info.topLeft()) #현재 창의 위치를 지정한 곳으로 이동
QMenuBar
, QToolBar
, QDockWidget
, QStatusBar
위한 고유 레이아웃 가짐btn = QPushButton('Button', self) #버튼 객체 생성
btn.move(80, 13) #(가로, 세로) 위치에 버튼 위치시킴
QHBoxLayout
, QVBoxLayout
클래스 : 여러 위젯을 수평/수직으로 정렬. 다른 레이아웃 박스를 넣거나 위젯을 배치 가능addStretch()
: 필요 공간 확보. stretch factor
로 비율 조절okButton = QPushButton('OK')
cancelButton = QPushButton('Cancel')
hbox = QHBoxLayout() #수평 박스 생성
hbox.addStretch(1) #왼쪽에 공간 확보
hbox.addWidget(okButton) #버튼 넣기
hbox.addWidget(cancelButton)
hbox.addStretch(1) #오른쪽에 공간 확보
vbox = QVBoxLayout() #수직 박스 생성
vbox.addStretch(3) #위쪽에 공간 확보
vbox.addLayout(hbox) #수평 박스룰 수직 박스 안에 넣기
vbox.addStretch(1) #아래쪽에 공간 확보
self.setLayout(vbox) #수직박스를 메인 레이아웃으로 설정
QGridLayout
클래스 사용grid = QGridLayout() #그리드 레이아웃 생성
self.setLayout(grid) #창의 메인 레이아웃으로 설정
grid.addWidget(QLabel('Text Rabel'), 0, 0) #라벨 객체를 0행 0열에 배치
grid.addWidget(QLineEdit(), 0, 1) #텍스트 편집 객체를 0행 1열에 배치
QPushButton(버튼)
, QLabel(텍스트/이미지 라벨)
, CheckBox(체크박스)
, QLineEdit(텍스트 편집기)
, QGroupBox(그룹박스)
, QSpinBox(정수 선택 및 조절)
, QTableWidget(표)
등의 위젯이 있어 이를 배치하여 화면을 구성
lcd = QLCDNumber(self) #숫자 LCD 스타일로 표시하는 객체
dial = QDial(self) #다이얼 객체
dial.valueChanged.connect(lcd.display)
#QDial 위젯 객체의 시그널에 연결
# valueChanged() 시그널을 lcd 객체의 display 슬롯에 연결
# display 슬롯은 숫자를 받아 QLCDNumber 위젯에 표시
class Communicate(QObject):
close_app_signal = pyqtSignal() #시그널
class MyApplication(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() #마우스 클릭 시 closeApp 시그널 방출
PyQt5.QtGui
의 QPainter
클래스 : 그리기 기능 제공하는 클래스. 위젯의 Paint Event로 동작이 주로 이루어짐
점 그리기(draw_point)
import sys
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QPen
from PyQt5.QtCore import Qt
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 400, 300)
self.setWindowTitle('Points')
self.show()
def paintEvent(self, e):
qp = QPainter() #QPainter 객체 생성
qp.begin(self) #QPainter 객체 시작
self.draw_point(qp) #그리기 함수
qp.end() #그리기 종료
def draw_point(self, qp):
qp.setPen(QPen(Qt.blue, 8)) #QPen 객체 할당 및 크기 설정
qp.drawPoint(self.width()/2, self.height()/2) #위치 설정
#또는
# pen = QPen()
# colors = ['#D83C5F', '#3CD88F', '#AA5CE3', '#29ACF2']
# for i in range(1000):
# pen.setWidth(np.random.randint(1, 15))
# pen.setColor(QColor(np.random.choice(colors)))
# qp.setPen(pen)
# rand_x = 100 * np.random.randn()
# rand_y = 100 * np.random.randn()
# qp.drawPoint(self.width() / 2 + rand_x, self.height() / 2 + rand_y)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
def draw_line(self, qp):
qp.setPen(QPen(Qt.blue, 8))
#선의 색과 두께 설정 또는 QPen의 Qt.DashLine처럼 선 스타일 설정
qp.drawLine(30, 230, 200, 50)
#(첫 점의 x, y, 두번째 점의 x, y)순으로 양 끝점 위치를 정수로 입력
qp.drawText(30, 90, 'Qt.DashLine') #선에 레이블 할당
PyInstaller
로 Python과 PyQt5로 만든 .py
GUI 프로그램을 .exe
파일로 변환 가능PyInstaller
패키지 설치pip install pyinstaller
.py
파일이 있는 폴더로 이동 후 명령프롬프트 열어 명령어 입력 : pyinstaller 파일이름.py
dist
폴더로 이동하면 실행파일 존재. 오픈 시 콘솔창이 켜지며 GUI 실행파일 실행-w
옵션 추가-F
또는 -onefile
옵션 추가