[Python] PyQT5 시작하기
by 담배맛구마Python을 GUI로 구현하기위한 방법
PyQT
* https://riverbankcomputing.com/software/pyqt/intro
PyQT는 QT라는 회사에서 만든 Framework와 Python v2, v3와 바인딩해서 플랫폼 제약없이 실행해주게하는 도구같은것으로 따로 Commercial 버전을 구입가능하다. PyQT4와 PyQT5가 있는데, Python3랑은 PyQT5가 호환된다고 한다.(Python2는 될련지모르긋다 다 걍 Python3쓰래)
UI 디자인은 마치 C언어로 Win32프로그램을 짜듯 하나하나 GUI를 좌표잡아서 할 수도 있지만 QT Designer로 편하게 할 수 있다. QT Designer로 UI를 구성하면 이를 XML(.ui) 포맷으로 저장하게 되고 이를 Python 코드로 변환해서 쓰면된다.
현재 Python3에 대한 PyQT5 가이드가 많이 없는데 딱 하나 찾았다. 기본적인 틀은 QT와 동일하기에 QT에 대한 도큐먼트를 봐도 크게 지장은 없었던것 같다.
* http://projects.skylogic.ca/blog/how-to-install-pyqt5-and-build-your-first-gui-in-python-3-4/
Hello, world!
예제 따라 걍 함
1. 일단 Designer로 *.ui라는 xml파일을 생성
-
디자인 과정은 MFC로 UI짜는 것 처럼 걍 드래그 앤 드랍 하면 설치된다.
-
각 종 이름이나 설정은 뭐뭐 있는지 쭉 보면 그냥 이해 된다.
-
이벤트는 그냥... 딱 봐도 어떻게 거는지 이해된다. 시그널과 슬롯이라는 키워드를 보자.
-
굳이 여기서 안해도 코드로 수정가능하다. 그래서 그냥 큰 틀만 한다.
-
기본 템플릿으로 Widget, Main Windows, Dialog가 있다.
* 비교글 2015/11/14 - [Programming/Python] - 004. PyQT Widget / Dialog / Main Window
2. pyuic5라는 툴로 ui파일을 python으로 변환
pyuic5 -x uiFileName.ui -o uiFileName.py
3. 생성된 python 코드를 보면 클래스로 정의되있음
이쁘게 주석으로 달아봤다.
# -*- coding: utf-8 -*-
#PyQT Designer에서 기본적으로 import하는 것들
#QtWidgets은 PyQT5에서 모든 UI 객체를 포함하고 있는 클래스라서 무조껀 import
from PyQt5 import QtCore, QtGui, QtWidgets
#말 그대로 Ui를 정의하고 있는 클래스'''
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(431, 241)
self.addBtn = QtWidgets.QPushButton(Form)
self.addBtn.setGeometry(QtCore.QRect(350, 10, 75, 23))
self.addBtn.setObjectName("addBtn")
self.textBox = QtWidgets.QLineEdit(Form)
self.textBox.setGeometry(QtCore.QRect(10, 10, 331, 20))
self.textBox.setObjectName("textBox")
self.textList = QtWidgets.QListView(Form)
self.textList.setGeometry(QtCore.QRect(10, 40, 331, 192))
self.textList.setObjectName("textList")
self.exitBtn = QtWidgets.QPushButton(Form)
self.exitBtn.setGeometry(QtCore.QRect(350, 40, 75, 191))
self.exitBtn.setObjectName("exitBtn")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "This is Widget"))
self.addBtn.setText(_translate("Form", "ADD"))
self.exitBtn.setText(_translate("Form", "EXIT"))
if __name__ == "__main__":
import sys
#모든 PyQT Application들은 항상 Application Object를 생성해야 함
#파라미터로 Shell에서 넘긴 값 sys.argv를 받고 있다. []를 넘겨서 안 받아도 됨
app = QtWidgets.QApplication(sys.argv)
#QtWidgets은 UI를 구성해주는 클래스들을 포함하고 있음
#해당 소스는 Widget임으로 QtWidgest의 QWidget 메소드 호출
Form = QtWidgets.QWidget()
#위에서 정의한 UI Form을 Form 객체에 적용하고 있음
ui = Ui_Form()
ui.setupUi(Form)
#Widget은 일단 메모리에 적재된 뒤 show 메소드로 화면에 보여
Form.show()
#참고로 Form.hide()하면 숨겨져
#이제부터 Application의 Mainloop에 들어가게 되
#Mainloop가 종료되려면 sys.exit()를 선언하거나 Mian Widget이 죽으면 되
#exec_인 이유는 Python에서 exec를 이미 사용하고 있어서 그렇대
sys.exit(app.exec_())
4. 시그널(Signal)과 슬롯(Slot)
하나하나의 객체들이 일으키는 이벤트들을 시그널이라고 하고 해당 시그널에 대해서 반응하는 함수를 슬롯이라 한다. 시그널과 슬롯을 정의할 때에는 방향을 지정하게 되는데 "송신자 → 시그널 → 수신자 → 슬롯" 이렇게 구성된다.
뭐 딱 보면 이해됨 소스 코드 상에서 정의해보자(위에 있는 소스를 임포트해서 쓰는 코드)
# -*- coding: utf-8 -*-
from widget import Ui_Form
#이 클래스는 위 소스에서 정의한 클래스를 들고와서 씀
class executePython(Ui_Form)
def __init__(self, widget):
Ui_Form.__init__(self)
self.setupUi(widget)
#위 소스에서 addBtn이라는 이름으로 버튼객체를 정의한게 있는데
#해당 객체에 clicked 이라는 시그널을 설정하고
#addTextBoxToTextList이라는 슬롯과 연결하겠다라는 뜻
self.addBtn.clicked.connect(self.addTextBoxToTextList)
#슬롯을 정의
def addTextBoxToTextList(self):
text = self.textBox.text()
self.textList.addItem(text)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
execUi = executePython(From)
Form.show()
sys.exit(app.exec_())
'Dev-' 카테고리의 다른 글
[Python] Geoip를 통한 IP 별 국가코드 매칭 (2) | 2016.07.09 |
---|---|
[Python] PyQT4 ComboBox와 TableWidget 제어 (0) | 2016.04.09 |
[Python] Send Mail by my gmail account (0) | 2016.01.10 |
[Python] PyQT5 기본템플릿비교(Widget, Dialog, Main Window) (0) | 2015.11.14 |
[Python] Log Gathering (0) | 2015.10.23 |
블로그의 정보
정윤상이다.
담배맛구마