.

[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_())
반응형

블로그의 정보

정윤상이다.

담배맛구마

활동하기