이번 시간에는 GUI와 기능을 연결지어 기능을 하는 UI를 만들어 보려고 한다.

 

이에 앞서 시그널과 슬롯에 대해 먼저 알아야 하는데,

 

시그널이란?


" 시그널 : 어떤 일이 발생할 때 보내지는 알림 "

 

예를 들면, 버튼을 누르거나, 입력란에 텍스트가 바뀌거나, 윈도우 텍스트가 입력되거나...

 

이런 시그널이 전송이 되면 슬롯에서 해당 시그널을 수신하게 되고,

슬롯에 저장되어있는 함수가 시그널을 인식하고 지정한 함수를 수행하게 되는것이다.

 

슬롯이란?


" 슬롯 : 시그널 수신기, 수신한 시그널로 부터 지정한 함수를 수행한다."

 

도식화 하면 아래와 같이 왼쪽에 있는 시그널이 들어가면

해당 시그널에 맞는 동작을 슬롯에서 수행하게 되는것

 

 

이제, 위의 내용을 예제로 만들어 보려고 한다.

아래 내용을 보면 button을 QPushButton 위젯으로 설정하고

클릭 시그널이 들어오면 the_btn_was_clicked func이 수행되도록 슬롯을 설정 해주었다. 

따라서 아래 위젯을 클릭하면 clicked가 print된다.

from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPushButton
import sys


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("My App")
        button = QPushButton("Press Me")
        button.setCheckable(True)          #QPushButton위젯을 클릭할수 있게 설정
        button.clicked.connect(self.the_btn_was_clicked) #button에 클릭시그널을 the_btn...함수에 연결
        self.setCentralWidget(button)
        
    def the_btn_was_clicked(self):
        print("clicked") # click시그널이 오면 해당 함수가 수행된다.
        
def main():

    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec()

if __name__ == "__main__":
    main()

 

 

 

UI에서 특정 동작을 하도록 만드는 내용을 정리하면 다음과 같다.

 

1. 특정 위젯 생성

2. 시그널을 해당 위젯에 연결

3. 연결시 동작할 func 생성

 

 

 


참고

-  도서  "파이썬과 Qt6로 GUI 애플리케이션 만들기"

 

2장에서 QApplication에 대해서 이야기 했었다.

QApplication은 이벤트 루프이며 사용자와 상호작용을 하는 루프 클래스라고...

 

이번장에서는 QMainWindow에 대해서 학습하려고 한다.

 

QMainWindow란?

복잡한 UI를 구성할 때, 즉 레이아웃 내에 다양한 기능의 위젯을 추가할 수 있도록 표준 위젯들을 제공하는 도구모음!

 

 

구성은 아래와 같이 진행한다.

 

1. MainWindow 클래스를 생성한다. 

2. __init__시에 super().__init__() 을 통해 QT_QMainWindow를 서브클래싱 할 수 있도록 한다.

3. pushbutton의 이름을 설정하고

4. 가운데에 위젯을 넣는다. 

 

from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPushButton
import sys


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("My App")
        button = QPushButton("Press Me")
        self.setCentralWidget(button)

def main():

    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec()

if __name__ == "__main__":
    main()

 

 

(추가) super().__init__()

 

추가로 super().__init__()에 대해 정리 하려고 합니다.

 

super().__init__()를 사용하게 되면 상속받은 클래스를 모두 사용할 수 있습니다. 

 

해당 내용은 파이썬에서 사용되는 구문으로 아래 코드를 예를 들어 설명하겠습니다.

 

해당 클래스들은 각각을 상속받고 있습니다.

A > B >  C 

즉, C는 B,A클래스를 모두 갖고 있습니다. 따라서 밑에 결과를 보듯이 A,B클래스의 함수를 모두 사용할수 있게 되는것이죠.

 

class A:
    def __init__(self):
        self.a = 10

    def get_a(self):
        return self.a

class B(A):
    def __init__(self):
        super().__init__()
        self.b = 20

    def get_b(self):
        return self.b

class C(B):
    def __init__(self):
        super().__init__()
        self.c = 30

    def get_c(self):
        return self.c

 

 

 

 

 

 

 

참고

-  도서  "파이썬과 Qt6로 GUI 애플리케이션 만들기"

- https://supermemi.tistory.com/entry/Python-3-super%ED%81%B4%EB%9E%98%EC%8A%A4-selfinit-%EC%97%90-%EB%8C%80%ED%95%B4-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

1장에서 간단하게 PyQt를 통해 윈도우 창을 켜봤다. 

 

간단한 코드에서도 모르는게 많아 정리하고 넘어가려고 한다.

 

    app = QApplication(sys.argv)
    window = QWidget()
    window.show()
    app.exec()

 

QApplication이란 무엇인가? 

 

책에서는 Qt어플리케이션의 핵심이 QApplication 클래스라고 한다. 

 

"QApplication은 애플리케이션의 이벤트 루프이며, 즉 GUI(윈도우)와 모든 상호자의 상호작용을 제어하는 핵심 루프이다."

 

 

 

쉽게 말하면 아래와 같다. 

 

1. 키를 누르거나 마우스를 클릭 = 이벤트 생성

2. 이벤트 루프의 분기마다 대기중인 이벤트를 확인 > 이벤트 핸들러로 전달

3. 해당 이벤트를 처리

4. 다른 이벤트를 기다림

 

다시 말해 생성한 GUI와 사용자가 소통을 하기위해서 필요한 Event loop였던것. 

해당 내용을 기반으로 아래 코드를 이해하자면,

 

# 1. QApplication에서는 sys.argv 즉 main.py를 받고 app의 변수에 넣는다.

    app = QApplication(sys.argv)

# 2. QWidget이 윈도우를 show
    window = QWidget()
    window.show()

# 3. 해당 내용을 app(QApplication)에서 실행한다. 
    app.exec()

 

 

 

참고

-  도서  "파이썬과 Qt6로 GUI 애플리케이션 만들기"

- https://velog.io/@toezilla/BeYourself-PyQt-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC

 

PyQt에 대해 알아보기 위해 "파이썬과 Qt6로 GUI 애플리케이션 만들기" 라는 책을 샀다.

 

지금부터 책을 읽어가면서 공부한 내용들을 해당 블로그를 통해 기록하려고 한다. 

 

PyQt란?


그럼 PyQt란 무엇인가? 책에서는 굉장이 두서가 길고 복잡하게 아래와 같이 설명한다. 

 

"QT는 크로스플랫폼 GUI 애플리케이션을 만들기 위한 무료 오픈소스 위젯 툴킷으로, 애플리케이션이 단일 코드 베이스로 윈도우, 맥OS, 리눅스, 안드로이드의 여러 플랫폼을 대상으로 할 수 있다...."

 

쉽게, 아래와 같이 정리 할 수 있는데.

1. 무료이고...

2. GUI애플리케이션이다??

3. 그리고 여러 플랫폼을 대상으로 만들 수 있다. 

 

이 정도만 알고 그러면 한 번 진행을 해보자.

 

 

PyQt시작하기


 

먼저 IDE 환경을 실행한다. (본인은 Pycharm을 사용한다.)

 

새로운 프로젝트를 실행시킨다.

 

1. FILE > New project 를 열어 실행한다.

2. 프로젝트 이름을 설정한다. (나는 기본 프로젝트이름 pythonProject1을 사용했다.

3. 가상환경 설정을 위해 콘다를 하고 python버전은 3.9>을 보통 사용한다.

4. 설정이 완료되면 create

5. 터미널 환경에서 PyQt를 설치한다. -> "pip install PyQt5"

 

 

 

이제 환경설정은 모두 완료가 되었다.

 

PyQt로 간단한 애플리케이션을 실행시켜보자.

 

코드는 다음과 같다.

# PyQt 클래스를 임포트한다. 애플리케이션 핸들러인 QApplication, 기본 빈 GUI위젯인 QWidget
from PyQt5.QtWidgets import QApplication, QWidget
import sys


def main():

# 애플리케이션에 전달된 커맨드라인 인수가 포함된 파이썬 리스트인 sys.argv를 전달하는 QApplication인스턴스를 생성
    app = QApplication(sys.argv)
    # QWidget인스턴스 생성
    window = QWidget()
    window.show()
    app.exec()

if __name__ == "__main__":
    main()

 

 

위 코드를 실행하면 다음과 같은 빈 창이 하나가 뜬다. 

 

 

이제 코드를 분석해보려고 하는데, 모르는게 생각보다 많다. 

 

    app = QApplication(sys.argv)
    window = QWidget()
    window.show()
    app.exec()

 

결국은 QApplication을 실행하고, 안에서 window위젯이 실행되는것 같은데, 그러면 sys.argv는 뭐고? QApplication, QWidget은 무엇인가??? 이 부분은 다음에 내용을 정리해보려고 한다.

 

 

참고

-  도서  "파이썬과 Qt6로 GUI 애플리케이션 만들기"

 

 

+ Recent posts