본문 바로가기
  • ▒ 네모의 쉽게 배우는 네트워크 | 개발 ▒
파이썬 개발/Qypt5

PyQt5 - 어플리케이션, 위젯, 윈도우, 이벤트 루프에 대해서

by 너l모 2022. 8. 3.
반응형

※ 업무하면서 습득한 내용들을 정리해 놓은 포스팅입니다 :P 추가로 궁금하신 점은 댓글로 남겨주시고 필요한 자료 있으면 요청주세요! 잘못된 내용이 있으면 고쳐주시면 감사하겠습니다. 자료 퍼가실 때는 출처 남겨주세요!


 ο 목차

     


    ※ 코드 보는 방법 참고

    ㅇ 달러 기호($)가 있는 경우 -> 리눅스 터미널에서 CLI 명령어 입력

    ㅇ "=#" 기호가 있는 경우 -> psql 쉘에서 명령어 입력

    ㅇ 꺽쇠가 하나 있는 경우(>) -> 윈도우 명령 프롬프트(cmd)에서 명령어 입력

    ㅇ 꺽쇠가 세개 있는 경우(>>>) -> python 쉘에서 명령어 입력


     

    PyQt에 대해 이해한 내용을 정리하고 저와 같은 다른 분들께 도움을 드리고자 작성하는 포스팅입니다 :)

     

    1. 개념 정리

    1) PyQt란?

    파이썬 플러그인을 바탕으로 개발된 GUI 개발 툴킷 라이브러리

    (즉, 파이썬으로 GUI 프로그래밍을 하기 위한 라이브러리) 

     

    2) 어플리케이션(QApplication)이란?

    - 만들어진 GUI 프로그램에서 사용자 상호 작용(클릭, 마우스 움직임 등)시 발생하는 이벤트를 처리하기 위한 이벤트 루프를 생성하고 프로그램에서 명시된대로 이벤트를 적절하기 처리하기 위한 QtWidgets 모듈의 클래스

      ※ 하나의 GUI 프로그램은 반드시 하나의 QApplication* 객체를 가지고 있어야 함. 

     

    - 예시) 어플리케이션 인스턴스 생성 예시

    app = QApplication(리스트_인자)

     

    3) 위젯(QWidget, QPushButton, QLabel 등)이란?

    - GUI 프로그램에서 윈도우와 사용자 인터페이스를 생성하기 위한 QtWidgets 모듈의 클래스

    - 기본적으로 모든 위젯은 윈도우를 생성하고 기본값으로 숨겨져 있음(코드 실행시 화면에 윈도우 출력 X)

    - 기본적으로 윈도우는 최상위 위젯이기 때문에 다른 윈도우나 레이아웃과 중첩되지 않음

       (즉, 하나의 위젯 당 하나의 윈도우 출력)

     

    - 예시) OS별 윈도우 예시

    출처 : https://www.pythonguis.com/tutorials/creating-your-first-pyqt-window/

    - 예시) 사용자 인터페이스 

    출처 : https://www.pythonguis.com/tutorials/creating-your-first-pyqt-window/

     

    2. PyQt 기본 동작 프로세스

    1) QApplication 객체 생성

    <코드 참조>

    from PyQt5.QtWidgets import QApplication
    
    app = QApplication(리스트_인자)

    - QApplication 클래스를 사용해 app 이라는 인스턴스 생성하기

    - 특별히 전달할 리스트 인자가 없다면 빈 리스트([])를 넘겨주거나 sys.argv(파일 경로) 값 넘겨주기

    ※ sys.argv 를 넘겨줄 경우 sys 모듈 import 필요

     

    2) QWidget 객체 생성

    - 여러 종류의 QWidget 중 하나를 골라 객체 생성하기

    ※ 위젯의 종류에는 QPushButton, QLabel, QCheckBox, QRadioButton, QComboBox  등이 있으며 위젯의 종류 및 특징에 대해서는 별도 포스팅 예정

    - 기본적으로 각각의 위젯은 하나의 윈도우를 생성하며 서로 겹쳐지지 않고 그 자체로 최상위 위젯이 됨

    - 객체 생성 방법) 위젯으로 객체를 생성하기 위해서는 위젯 클래스로부터 파생된 서브 클래스를 만들어 사용

     

    <코드 참조 - 위젯 클래스의 서브 클래스 생성 코드>

    from PyQt5.QtWidgets import QPushButton
    
    class MyWindow(QPushButton) :
        def __init__(self):
            super(MyWindow, self).__init__()
            self.initUI()
            
        def initUI(self) :
        	self.btn = QPushButton(self)
            self.btn.setText('Test Button')

     

    <코드 참조 - 서브 클래스의 인스턴스 생성 코드>

    mw = Mywindow()

     

    3) 이벤트 루프 시작

    - Qt의 '시그널 & 슬롯' 매커니즘을 처리하기 위한 이벤트 루프 생성 및 실행하기

    ※ 시그널(signal) : Qt의 객체에서 사용자 인터페이스 변경 혹은 동작이 감지되는 경우 이에 대한 알람으로 발생되는 신호

    슬롯(slot) : 특정 시그널이 발생되는 경우 호출되는 함수를 의미

    - QApplication 클래스를 사용하여 이벤트 루프 생성 및 실행

     

    <코드 참조 - 이벤트 루프 생성 코드>

    app = QApplication([])

     

    <코드 참조 - 이벤트 루프 실행 코드>

    sys.exit(app.exec_())

    ※ exec 명령을 통해 프로세스 종료시까지 이벤트 루프를 계속 실행시키며 중간 중간 발생하는 이벤트를 처리

    하위 버전(파이썬2.x, Qt4 ...) 와의 호환을 위해 exec_를 사용하며 Qt5만 사용하는 경우 exec()만 사용해도 무방함

     

    3. 전체 코드 참고

    - PushButton을 포함한 위젯 생성 코드

    import sys
    from PyQt5.QtWidgets import QApplication, QPushButton
    
    class MyWindow(QPushButton):
        def __init__(self):
            super().__init__()
            self.initUI()
            
        def initUI(self):
            self.btn = QPushButton(self)
            self.btn.setText("Test Button")
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = MyWindow()
        ex.show()                // 디폴트로 숨겨져 있는 윈도우를 화면에 출력하는 함수
        sys.exit(app.exec_())

     

    4. 결과 예시

    - Test Button을 포함하는 윈도우가 생성됨

    - 시그널에 대한 슬롯을 만들지 않았기 때문에 지금은 Test Button을 클릭해도 아무런 변화가 없음 

     


    ※ 좋아요와 구독은 큰 힘이 됩니다. 감사합니다. 

    반응형

    댓글