아직 우리는 기초단계에 있기 때문에 지난 글을 읽고 오지 않으셨다면 꼭 읽고 와주시기를 바란다.

2021.08.27 - [Python/파이선과 친해지기] - [Python] - Python과 예쁘게 친해지기-PyQt

 

[Python] - Python과 예쁘게 친해지기-PyQt

오랜만에 Python과 친해지기 강의를 쓰기 위해 키보드를 잡았다. 사실 이 정도면 Python에서 사용되는 대부분의 용어나 개념을 설명했다고 생각하는데, client 프로그램을 만들기 위한 QT Library를 다

tutoreducto.tistory.com

 

## myqt.py

from PyQt5.QtWidgets import QApplication, QWidget, QLabel
import sys

if __name__ == "__main__" :
    app = QApplication(sys.argv)
    first_window = QWidget()
    first_window.show()
    app.exec_()

우리가 지난시간 작성한 코드다. 이름대로 기 때문에 다 어떤 동작을 하는지 대충 예상할 수 있는데, 특이한 인스턴스가 하나 보인다.

 

"QApplication"

 

얘는 뭐하는 애일까?


QApplication과 EVENT

 

"QApplication은 Q-Widget 기반의 애플리케이션 기능을 포함한 QGuiApplication의 특수한 형태입니다. QApplication은 위젯의 초기화 / finalization을 처리합니다."

- qt공식 홈페이지 : https://doc.qt.io/qt-5/qapplication.html#details -

 

말이 조금 어려운데, 결국  Q-Widget이 동작하기 위한 기반 위젯이 QApplication이다. 요놈은 다른 QWidget의 생성 / 전시 / 삭제를 처리한다. 우리의 앱에서 최초의 QWidget이 나오기 전에 QApplication이 있어야 하는 이유가 바로 QApplication이 QWidget의 생성을 담당하기 때문이다.

 

한 프로그램에는 QApplication은 한개만 존재한다. 창이 2개 이상이 되더라도 QApplication은 하나만 존재한다.(음.... Python형 싱글턴 객체라고 볼 수 있겠다.) 여담으로 Qt기반의 Widget이 아닌 경우에 저기 정의에 있는 QGuiApplicatio을 사용한다. 홈페이지에 나와있는 기능은 또한 다음의 것들도 처리하는 것으로 적혀있다. 의역하니, 원문을 보고 싶은 사람은 위 qt공식 홈페이지를 방문하자(여기는 Qt가 C++형태이니 함수명이나 클래스명은 그냥 참고만 하자)

  • palette(), font()와 doubleclickInterval()등의 데스크탑 세팅을 초기화한다. 또한 제어판 설정 같은 데스크톱 세팅을 추적하고 반영한다.
  • 이벤트 처리를 담당한다. 관련된 widget에서 이벤트를 송/수신한다. 사용자는sendEvent()와 postEvent()를 위젯에 사용하여 자신만의 이벤트를 전송한다.
  • Command line 인자를 파싱하고 적절하게 초기화한다.-> 요래서 QApplication에 sys.argv가 인자로 들어가는 ㅋㅋ루삥뽕이다.
  • QStyle()으로 애플리케이션의 디자인을 설정한다. setStyle()로 이건 변경할 수 있다.
  • trainslate()기능을 이용해서 지역 언어로 설정할 수 있다.
  • desktop()이나 clipdoard()등을 이용해서 매지컬 오브젝트를 사용한다.
  • QApplication은 widget의 정보를 추적한다. 즉 widgetAt()으로 위치도 가져오고 topLevelWidget()으로 리스트도 가져오고 한다.
  • setOverrideCursur()매서드를 이용해서 애플리케이션의 마우스 움직임을 처리한다.

 

두 번째 기능에 집중해보자. QApplicationd은 이벤트 처리를 담당한다고 한다. 이벤트는 무엇이고 이걸 어떻게 처리한다는 것인가? 


이벤트

 

이벤트는 dispatch 되는 신호이다. 구현은 QEvent()라는 객체를 상속받아 구현되는데, 외부의 자극(유저의 입력 / 프로그램의 움직임 등 겁나 광범위하다.)과 그에 대하 한 결과로 이루어져 있다. 당연하게도 프로그램을 사용하면 엄청나게 많은 이벤트들이 발생한다. 그걸 정확하게 처리하는 기술이 바로 Event Loop이다. QT에는 이벤트 큐(Event Queue)라는 자료구조가 존재한다. 이벤트는 발생된 순서대로 이 Event Queue에 push 한다. QApplication은 이 이벤트 큐를 무한루프 하며 이벤트를 하나하나 처리한다. 큐에 저장된 Event는 Event Handler에 의해 수집되며 이벤트를 accept 할지 ignore 할지를 판단한다. 결정하면 Event를 받는 slot에 정의된 기능에 따라 Event는 처리되고, 다음 Event를 검사한다.


이론적인 이야기가 많았다. 물론 이걸 몰라도 GUI 프로그래밍을 할 수는 있지만 한 단계 높은 성장을 위해서는 필수적으로 알아야 하는 내용이라 적어두었으니, 꼭 관심 가지고 읽어주시기 바란다. 다음 시간에는 드디어 우리의 QWidget을 조금 발전시켜보자.

오랜만에 Python과 친해지기 강의를 쓰기 위해 키보드를 잡았다. 사실 이 정도면 Python에서 사용되는 대부분의 용어나 개념을 설명했다고 생각하는데, client 프로그램을 만들기 위한 QT Library를 다루지 않은 게 항상 마음에 걸렸다. Python

누구나 인정하듯 빠른생산속도를 압도적인 장점으로 다른 언어와 차별점을 두는 특징이 있다. 이번 Python과 예쁘게 친해지기 시간을 통해서 Python으로 GUI Programming에 입문하는 사람이 많았으면 좋겠다. 프로토타입 작성할 때 이거만 한 게 없다.

 

* 본 포스팅은 PyQt5를 지원합니다.


GUI

 

"Graphic User Interface"

 

그렇다. 사용자는 우리 프로그래머들처럼 검정화면만 보고 희열을 느끼는 변태가 아니다(헤헿...콘솔....까맣다...이쁘다...) DOS운영체제가 window로 바뀌며 그래픽 요소가 생기듯, 언제나 사람-지향적인 환경은 글자가 즐비한 환경이 아닌 Graphic, 가시적인 요소로 이루어진 환경이다. 전통적인 프로그램 언어인 C++에서도 WINDOW API로 당연히 GUI Programming을 지원하며, QT라는 고-급 라이브러리를 이용해서 복잡한 C++ WINDOW 프로그램을 이쁘게 만들 수 있다. JAVA에서는 AWT나 SWING 최근 들어서는 JAVAFX를 통해서 JAVA 나름대로의 그래픽 환경을 조성한다. 우리 Python은 실행 속도의 한계도 있고 기타 여러 가지 이유로 C++에 있는 QT LIBRARY를 Pythonic 하게 변환하는(즉 컴파일 시에는 원래 QT로 바뀌는) PyQt를 제공한다.

<PYQT 로고>


PYQT의 설치

새로운 물건을 발견하면 당연히 설레는 기분이 먼저아니겠는가 우선 바로 손으로 찍어먹어 볼 수 있게 PyQt를 설치하겠다.  

c$> pip3 install pyqt5

단순한 명령어다. pyqt5또한 pip를 통해서 다운로드 가능하니 다운로드를 하자. 다음 idle에서 import PyQt5 시  에러가 없으면 설치에 성공한 것이다.

>>> import PyQt5
>>>

HELLO PYQT!

우리의 영광스러운 첫코드는 myqt.py로 이름을 짓도록 하자. 앞으로 이 코드 기준으로 많은 예제를 실습할 예정이니, 떨리는 손을 다른 손으로 잡고 코딩에 들어가자 자 이제 PyQt5를 만나러 가보자

## myqt.py

from PyQt5.QtWidgets import QApplication, QWidget, QLabel
import sys

if __name__ == "__main__" :
    app = QApplication(sys.argv)
    first_window = QWidget()
    first_window.show()
    app.exec_()

아직은 저렴해 보이는 이 도화지가 우리 여행의 출발점이다. 주석을 조금 달아 코드를 설명하자면 다음과 같다.

  • from PyQt5.QtWidgets import QApplication, QWidget, QLabel : PyQt5.QtWidgets에는 화면에 표현할 요소인 Widget이 사전에 정의되어 있다. 이번 코드에서는 QApplication과 QWidget만 사용한다. 어 나 QLabel은 안 썼는데?
  • app = QApplication(sys.argv) : 시스템 인자를 매개변수로 QApplication을 구동한다. QApplication은 이벤트 루프를 처리하는 widget으로 생각해주면 된다. 
  • first_window.show() : 모든 widget은 parent의 속성에 종속적이지만, 단독이라면 보이지 않는(invisible) 상태이다. show() 함수를 호출하여 눈에 보이게 하였다.
  • app.exec_() : QApplication을 시작한다. 이는 기존 QT의 exec와 같은 함수이나, Python에서 exec은 예약어이기에 언더스코어(_)가 붙는다. 이는 print도 동일하다. 포스팅을 따라오다 보면 print_()를 만날 수 있다.

새로운 내용을 시작하려니 필자도 벌써 설레는 기분이다. 이번 시간에 우리는 pip를 이용해서 PyQt5를 설치하였고, 우리의 처음 Application을 띄워보았다. 다음 시간에는 우리 도화지를 조금 더 이쁘게 꾸며줄 템플릿인 MainWindow을 알아보고 QAppliaction에 대해서 조금 자세하게 알아보자

+ Recent posts