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

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을 조금 발전시켜보자.

* 프로그램 요청이나 산출물 요청은 댓글로 달아주세요!

 

기다리고 기다리던 CVE SCRAPPER의 시현 시간이다. 개발정보는 -계획,진행-편에 들어있다.

2021.06.16 - [Python/Python Project] - [Python Project] CVE Scrapper 만들기 - 계획,진행-

 

[Python Project] CVE Scrapper 만들기 - 계획,진행-

블로그에 올릴 장기적인 프로그램을 만들고자 한다. 정보보안에 관심있는 필자이다 보니, 당연히 취약점에 눈이 들어오는건 당연하다. 속내를 말하자면 "와 이거 하루에 하나씩만 해도 한 3년은

tutoreducto.tistory.com

 


디렉토리 구조

이렇다. 코드 각각의 설명은 -기능도-편을 참고하자

2021.06.19 - [Python/Python Project] - [Python Project] CVE Scrapper 만들기 - 기능도-

 

[Python Project] CVE Scrapper 만들기 - 기능도-

코드별 클래스, 함수명에 대한 설명이다.

tutoreducto.tistory.com

 


시현

CveMain은 다음과 같이 실행된다. vendor의 목록은 cve_list directory에서 긁어온다. 

 

Make Report로 보고서를 만들 수 있다. Exported?가 True인 행은 Information dialog가 띄워지며 export가 안된다. exported 된 여부 판단은 export_cve directory에 해당 cve보고서가 존재하는지 여부로 판단한다.

export 된 보고서는 export_cve directory에서 찾을 수 있다.


OUTPUT

 

보고서는 다음과 같이 제작되어있다.

CVE-2010-4218.pdf
0.18MB


후기

짧은 프로젝트였다. 정식으로 뿌리는 것도 아니고, 디자인을 하나도 안 한 프로젝트였다. 찾아보니 TISTORY API가 있는 거 같은데, 이거 자동화해서 블로그에 보고서를 올리면 좋을 거 같다. 크롤링 코드와 gui를 연습할 수 있는 좋은 경험이었던 거 같다. fpdf를 사용하다 보니 편하다는 것을 느꼈다. body부분의 글자별 스타일 적용이 어렵다는 느낌은 받았지만 다음 자동화 프로젝트도 fpdf로 출력할 거 같다.

+ Recent posts