1. QLabel

PyQt5의 레이블 사용법에 대해서 알아보겠습니다.

 

PyQt에도 공식문서가 있는데

C++을 위주로 설명하다보니

파이썬 사용자들은 좀 어려움이 있는데요.

 

Qt의 Wrapper 가 PyQt 라는 것을

감안하면 C++도 배워야 할 필요성을

느끼게 됩니다.

 

QLabel Class | Qt Widgets 5.15.4 C++용

 

QLabel Class | Qt Widgets 5.15.4

QLabel Class The QLabel widget provides a text or image display. More... Header: #include qmake: QT += widgets Inherits: QFrame Properties Public Functions Reimplemented Public Functions Public Slots Signals Reimplemented Protected Functions Detailed Descr

doc.qt.io

 

C++ Qt에서 PyQt로 넘어오는 것은 쉽지만

PyQt 를 통해서 C++용

Qt를 배우는 것은 어렵습니다.

 

그렇다고 C++을 모르면

PyQt를 사용못하는 것은 아닙니다.

파이썬 문법의 장접을 살려

최대한 쉽게 직관적으로

접근하는게 좋습니다.

 

레이블도 QWidget 에서 파생된 클래스입니다.

온라인 레퍼런스에는 QFrame 상속이라고

되있는데 QFrame 이 QWidget 상속이니

QLabel은 손자뻘입니다.

 

여기서 레이블의 특성을 생각해보면

텍스트 또는 이미지 레이블이라 할 수 있는데

비슷하게 생긴 버튼과 차이점은

버튼은 사용자가 클릭시 액션(슬롯)이 있지만

레이블은 그런 시그날이 없습니다.

 

GUI 프로그래밍에서 레이블과 버튼을

잘 생각해보면 생긴것은 거의 비슷하고

기능적 차이만 있는 겁니다.

 

즉 버튼은 사용자의 클릭을 전제로 하고

레이블은 정보의 표시가 목적입니다.

 

 

이 차이점을 알면 어떤 GUI 프로그래밍에서도

개념이 잘 이해가 됩니다.

 

웹페이지에 비교하면

웹페이지에는 따로 레이블이 필요없습니다.

 

웹브라우저에는 기본적으로 텍스트에 대한

양식이 존재하기 때문입니다.

 

한줄이 끝나면 다음줄이 출력되는 것은

당연한게 아니라 텍스트 출력 형식을

사용하기 때문입니다.

 

이는 운영체제가 콘솔같은 환경에서

제공하는 것도 있고 텍스트 에디터나

워드처럼 자체적 텍스트 모드를

갖춘 앱도 있습니다.

 

GUI에서 레이블을 사용하는 것은

그러한 텍스트 모드가 기본이

아니기 때문입니다.

 

약간 혼동스런 설명일 수도 있는데

우리가 스크린에 표시되는 모든 것에

특정한 메카니즘이 있는데

당연한듯 보이는 텍스트 사용방식이

GUI에서는 처음부터 법칙을

다시 쓰는 것이라고 보면 됩니다.

 

텍스트도 화면에 그리는 일입니다.

 

당장에 100% 이해가 어려워도 괜찮습니다.

 

레이블을 사용하는 이유는

텍스트 에디터처럼 줄바꿈이 없어서이다.

라고 알아도 하나의 차이를 아는 것입니다.

 

아래 예제는 QLabel 을 생성하고

사용하는 것입니다.

 

Qt 문서가 C++ 이고 좀 어렵긴한데

그래도 인터넷에는 PyQt 문서가

많이 있기 때문에 구글링을 잘하면

필요한 API를 찾을 수 있을 겁니다.

 

공식 API를 보는게 제일 좋지만

꼭 그렇지 않아도 stackoverflow 나

quora 에서도 관련 자료가 많이 있습니다.

 

파이썬의 라이브러리를 사용할 때

검색능력은 곧 실력입니다

 

from PyQt5.QtWidgets import (
    QWidget, QVBoxLayout, QApplication,
    QLabel
)
from PyQt5.QtCore import Qt

import sys

class MyApp(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setWindowTitle("My App")

        # grid layout
        layout = QVBoxLayout()
        self.setLayout(layout)

        label = QLabel("My App Story")
        label.setAlignment(Qt.AlignCenter)
        layout.addWidget(label, 0)

        label = QLabel("PyQt5 is easy to learn and helpful. "
                       "You can learn it quickly. it's so cool")
        label.setWordWrap(True)
        label.setAlignment(Qt.AlignCenter)
        layout.addWidget(label, 0)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    screen = MyApp()
    screen.resize(300, 200)
    screen.show()

    sys.exit(app.exec_())

 

QLabel PyQt5
QLabel PyQt5

 

 

2. QPushButton

QPushButton 과 QLabel의 차이점에 대해서

위에서 설명했습니다.

 

레이블과 버튼의 결정적 차이는

사용자가 클릭할 것을 기대하면 버튼이고

그냥 읽기만 한다면 레이블이라고 했습니다.

 

그래서 버튼에는 한가지를 더 해주는 겁니다.

 

버튼인스턴스.clicked.connect(연결 메소드 - 슬롯)

 

이렇게만 해주면 버튼을 클릭한

시그널을 받아서 해당 슬롯을 실행합니다.

 

PyQt 에서는 시그널이 이벤트이고

액션인 메소드가 슬롯입니다.

(이벤트-액션 이라는 뜻)

 

물론 디폴드 슬롯이 많이 있는데요

보통은 아래와 같이 사용자 슬롯을 만들어서

클릭시 동작을 정의합니다.

 

from PyQt5.QtWidgets import (
    QWidget, QVBoxLayout, QApplication,
    QLabel, QPushButton
)
from PyQt5.QtCore import Qt

import sys

class MyApp(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setWindowTitle("My App")

        # QVBox Layout
        self.layout = QVBoxLayout()
        self.setLayout(self.layout)

        btn1 = QPushButton("CLICK NOW!")
        btn1.clicked.connect(self.btnClicked)
        self.layout.addWidget(btn1, 0)

    def btnClicked(self):
        self.label = QLabel("Button Clicked!")
        self.label.setAlignment(Qt.AlignCenter)
        self.layout.addWidget(self.label, 0)
        print("NICE CLICK")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    screen = MyApp()
    screen.resize(300, 200)
    screen.show()

    sys.exit(app.exec_())

 

QPushButton PyQt5
QPushButton PyQt5

 

 

요약

GUI창과 레이블과 버튼만 가지고도

무수히 많은 프로그램을 처리할 수 있습니다.

 

프로그램이란 기본적으로 입출력으로

돌아갑니다.

 

레이블은 출력(유저가 보는 글자)

버튼은 입력(유저가 입력)하는 것으로

생각하면 이유를 알 수 있겠죠.

 

원초적 GUI 계산기를 생각해보면

버튼과 레이블만 있습니다.

 

유저는 버튼에 어떤 기능이 있을 것을

예상하고 클릭이라는 입력을 하는 것입니다.

 

이 입력을 받아서 슬롯에서 처리한 후에

레이블이라는 출력에서 결과를 볼 수 있습니다.

 

어떻게 보면 콘솔 프로그램의 흐름과 다르지 않습니다.

 

프로그램 시작 -> 사용자 입력 -> 결과 출력

 

이 과정을 GUI를 사용해서

메인 루프를 돌려 무한히

입력과 출력을 반복 할 수 있습니다.

 

콘솔 프로그램은 while 문 루프 없이

한번의 입력과 출력으로 끝나지만

 

GUI프로그램은 로직을 반복하기 위해

while 을 사용할 필요가 없습니다.

 

왜냐하면 이미 main loop 에서

while 문이 돌고 있기 때문입니다.

 

if __name__ == "__main__":
    app = QApplication(sys.argv)
    screen = MyApp()
    screen.resize(300, 200)
    screen.show()

    sys.exit(app.exec_())

 

에서 app.exec_() 가 시작되면

이미 while 문이 돌아가는 상태가 됩니다.

이게 GUI의 기동원리인데요.

물론 그 안에서는 훨씬 복잡한 일들이

일어나고 있습니다만

그건 운영체제의 영역이고

괜찮은 GUI 앱을 개발하기 위해서는

이 정도만 알아도 충분합니다.

 

QLabel, QPushButton 클래스의

문법 작성하는 일은 별로 어렵지 않습니다.

 

원리적으로 이해하는 것도 조금은

필요하지 않을까 싶어서

포스팅을 해봤습니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band