나의 작은 valley

[pyqt] GUI 개발에 사용되는 기본적인 위젯들 본문

Computer Science/[PyQt]

[pyqt] GUI 개발에 사용되는 기본적인 위젯들

붕옥 아이젠 2024. 1. 31. 02:00
728x90

 이 포스팅에서는 레이아웃 설정, QLineEdit, QPushButton 객체 등등 pyqt로 gui를 개발할 때 사용되는 기본적인 객체들을 알아볼 것이다. 물론 나중에는 qt desginer라는 훌륭한 도구를 사용하여 드래그 앤 드랍 방식으로 사용할 것이지만 시작하는 단계에서는 기본적인 개념을 알아둘 필요는 충분하다. 

 

Prerequirements

Pyqt는 Class를 사용하여 코드를 작성해야한다. 그렇기에 OOP(객체지향 프로그래밍)에 대한 공부가 선행되어야 한다.클래스를 사용한다는 점은 다른 gui 라이브러리(대표적으로 Tkinter)와의 차이점이다. 덕분에 어려운 점도 많지만 익숙해지면 더 편리하다는 생각이 들 것이다. 

 

 

GUI 창 열기

import PyQt5.QtWidgets as qtw
import PyQt5.QtGui as qtg

class MainWindow(qtw.QWidget):
    def __init__(self):
        super().__init__()
        self.show()
        
app = qtw.QApplication([])
mw = MainWindow()
app.exec()

class를 만들고 그 클래스에 __init__ 부분에서 show()를 함으로서 기본적인 gui 창을 만들 수 있다. 이제 mw라는 변수명을 가진 클래스 객체를 만들고 실행하면 빈 gui 창이 만들어진다.

 

app이라는 변수는 그냥 외우는 것이 마음이 편할 것이다. 또 QApplication() 매서드의 파라미터로 리스트가 들어가는 것을 볼 수 있는데 이에 대한 설명은 뒤로 미루겠다.

 

 

GUI 제목 짓기

간단한 명령어를 통해 윈도우 타이틀을 정할 수 있다. 바로 __init__ 부분에서 다음의 코드를 입력하면 된다.

self.setWindowTitle("Hello World")
 
원래는 설명을 안하려고 했는데 ... __init__ 함수는 특별한 함수로 class 객체가 호출될 때 자동으로 실행된다. class 객체가 호출됐다는 것은 창을 만들려는 시도가 있었다는 의미이고 그때 바로 창의 이름이 지어져야하니깐 __init__ 함수 안에 코드를 넣어야하는 것이다. 앞으로 배우는 과정에서 어떤 코드를 __init__에 넣으면 좋을지를 생각하며 글을 읽자.
 
 
 

레이아웃  설정

Gui 프로그래밍에서 가장 중요한 부분이 이 부분이다. Layout은 영역을 의미한다. 특정 영역에 박스를 넣거나 버튼을 넣거나 할 수 있다. 그러면 그 영역은 한 팀처럼 움직인다. 다양한 종류의 layout이 있는데 간단하게 boxlayout을 만들어보았다.

self.setLayout(qtw.QVBoxLayout())

 레이아웃 설정은 언제해주어야할까. class 객체가 호출되었다는 것은 gui 창이 켜졌다는 뜻이다. 그런데 gui 창이 켜진 이후에 레이아웃 영역이 출력되면 될까? 안된다. 그렇기에 이부분도 __init__함수 내부에 있어야한다. 물론 특정한 행동을 한 이후에 레이아웃 영역이 보이게 하고 싶을 때는 예외이다. 

 

 

QLabel 위젯

무조건 사용되는 위젯이다. 말 그대로 Label인데 한국어로 잘 번역하면 글자 정도가 되겠다. 글자를 gui 창에 띄어주는 아주 필수적인 위젯이다. 

#create A label
my_label = qtw.QLabel("What is your name")
my_label.setFont(qtg.QFont("Arial", 18))
self.layout().addWidget(my_label)

다음의 코드를 통해 만들고 layout()에 추가할 수 있다. layout에 추가가 되면 show() 매서드가 실행될 때 label이 추가되서 나온다. Font 매서드는 눈치껏 이해하면 되겠다. (글씨가 Arial 라는 글꼴이 되고 사이즈는 18pt가 되도록 설정. 츤츤)

 

QLineEdit 위젯

사용자의 입력을 받을 수 있게 해주는 위젯이다.
#create an entry box
my_entry = qtw.QLineEdit()
my_entry.setObjectName("name_field")
my_entry.setText("")
self.layout().addWidget(my_entry)

setObjectName 매서드는 중요하다. 해당 매서드는 QLineEdit 위젯의 이름을 지어주는 매서드이다. 이 이름은 식별자로서 나중에 코드에서 해당 위젯을 찾아주는데 사용할 수 있다.

 

setText는 변수로 들어온 문자열을 기본 값으로 띄어주는 매서드이다. 

 

그렇게 만들어진 QLineEdit 위젯을 레이아웃에 추가하였고 이후 실행한 결과는 위의 그림과 같다.

 

 

QPushButton 위젯

my_entry에 글자를 입력했으면 이제 전송할 버튼을 만들고 싶다는 생각이 들 거이다. 

#create a button
my_button = qtw.QPushButton("Prees me !")
self.layout().addWidget(my_button)

 

아주 손쉽게 버튼을 만들 수 있다. 그러나 버튼은 만들어지는데 눌러도 아무런 일이 생기지 않는다. 당연한 일이다. 우리가 아무런 설정도 지금은 해주지 않았기 때문이다. 

 

이벤트 연결

이제부터 본격적인 gui 프로그래밍이 시작된다. 

my_button = qtw.QPushButton("Prees me !",
                            clicked = lambda: press_it()
                            )

clicked는 버튼이 클릭되면 보낼 시그널을 의미한다. 이떄 lambda: press_it()의 의미는 press_it() 이라는 함수를 버튼이 클릭되면 실행하라는 뜻이다. 그러면 press_it()이라는 함수를 구현하자.

def press_it():
    my_label.setText(f"Hello {my_entry.text()}")
    my_entry.setText("")

이름이 입력되면 그 이름을 my_entry.text()를 통해 읽어온다. 이후 그 값을 setText 매서드로 label에 넣어준다. 그러면 my_label이 업데이트가 된다. 업데이트가 완료되면 QLineEdit 위젯은 초기화를 해주어야한다.

마치며

아주 간단한 gui를 만들어보는 시간을 가져보았다. 

728x90
Comments