본문 바로가기

PyQt GUI

PyQt GUI (1) : PyQt GUI Hello World

728x90

https://www.youtube.com/watch?v=U_vWfzhWINw

PyQt를 이용한 GUI 만들기 첫 시간입니다.

GUI에서 가장 많이 사용하는 위젯인 

 

Label : 가장 간단하게 Text를 출력하는 위젯

PushButton : 버튼 위젯

ComboBox : 여러 목록 중 하나를 선택할 수 있는 위젯

CheckBox : 체크, 언체크를 선택할 수 있는 위젯

RadioButton : 여러 목록 중 하나를 선택할 수 있는 위젯

SpinBox : 정수를 쉽게 입력 할 수 있는 위젯

DateEdit : 날짜를 입력 하는 위젯

TimeEdit : 시간을 입력하는 위젯

ListWidget : 리스트의 원소를 출력하는 위젯

 

을 한 번씩 만들어 보는 가장 간단한 GUI프로그램을 생성합니다.

import sys
from PyQt5.QtWidgets import *

class Main(QDialog):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        layout = QVBoxLayout()

        label_widget = QLabel("Hello World!")
        
        button_widget = QPushButton("Click Me")
        
        combobox_widget = QComboBox()
        combobox_widget.addItem("Python")
        combobox_widget.addItem("C")
        combobox_widget.addItem("C++")
        combobox_widget.addItem("Fortran")
        combobox_widget.addItem("Basic")

        check_box_widget_summer = QCheckBox("Summer")
        check_box_widget_winter = QCheckBox("Winter")

        radio_button_widget_male = QRadioButton("Male")
        radio_button_widget_female = QRadioButton("Female")

        spinbox_widget = QSpinBox()

        date_widget = QDateEdit()
        time_widget = QTimeEdit()

        list_widget = QListWidget()
        item_1 = QListWidgetItem("Cat")
        item_2 = QListWidgetItem("Dog")
        list_widget.addItem(item_1)
        list_widget.addItem(item_2)

        layout.addWidget(label_widget)
        layout.addWidget(button_widget)
        layout.addWidget(combobox_widget)
        layout.addWidget(check_box_widget_summer)
        layout.addWidget(check_box_widget_winter)
        layout.addWidget(radio_button_widget_male)
        layout.addWidget(radio_button_widget_female)
        layout.addWidget(spinbox_widget)
        layout.addWidget(date_widget)
        layout.addWidget(time_widget)
        layout.addWidget(list_widget)

        self.setLayout(layout)
        self.resize(1000, 500)
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = Main()
    sys.exit(app.exec_())

위 코드를 실행하면, 다음과 같이 위젯들을 출력하는 기본 GUI 창이 생성 됩니다. 

위 프로그램에는 특별한 기능은 없고, 단지 자주 사용하는 위젯을 어떻게 생성하고 메인 UI에 배치할 수 있는가를 보여줍니다. 

 

위 코드의 각 부분을 하나 하나 설명하면 다음과 같습니다. 

import sys
from PyQt5.QtWidgets import * # PyQt5의 위젯을 불러 옵니다. 
                              # 프로그램에서 사용하는 위젯을 하나 하나 불러 오기 
                              # 귀찮기 때문에 모든 위젯을 불러 옵니다.

class Main(QDialog):          # 메인 클래스를 생성합니다. QDialog를 상속 받습니다.
    def __init__(self):       # QDialog는 아주 기본적인 Dialog중 하나 입니다.
        super().__init__()
        self.init_ui()        # init_ui 메소드에서 모든 작업을 합니다.

PyQt에서는 QWidget, QDialog, QWindow등의 기본 Dialog창을 선택할 수 있습니다. 그 중에서 QDialog는 가장 간단한 Dialog중 하나 입니다. 좀 더 복잡하고 다양한 기능이 있는 UI를 생성하기 위해서는 QWindow를 사용하는 편이 좋습니다.

    def init_ui(self):
        layout = QVBoxLayout() # Vertical Box Layout을 생성합니다.

		### 이곳에서 위젯을 생성하고, 생성한 위젯을 layout에 추가합니다 ###


        self.setLayout(layout) # layout을 QDialog의 layout으로 set 합니다.
        self.resize(1000, 500) # 창의 기본 크기를 1000px * 500px 로 설정합니다.
        self.show()            # QDialog를 화면에 띄웁니다.

이 코드의 대부분의 내용은 init_ui 메소드에 정의 돼 있습니다. 

init_ui 메소드에서는 QVBoxLayout인 layout을 생성하고, layout에 다양한 위젯을 배치하고, 이 layout을 QDialog의 layout으로 설정(setLayout)하게 됩니다. 

 

QVBoxLayout은 PyQt의 레이아웃 중 하나로, 위젯들을 위에서 부터 아래로, 즉 Veritcal 한 방향으로, 배치하는 레이아웃 입니다. 가장 많이 사용되는 레이아웃 중 하나 입니다. 

 

resize(크기, 크기)를 통해서 창의 기본 크기를 설정하고, show()를 호출하여 QDialog창을 띄웁니다. 

        label_widget = QLabel("Hello World!") #Label 위젯을 생성하고 "Hello World"로 정의합니다.
        
        button_widget = QPushButton("Click Me") # "Click Me"라는 이름의 버튼을 생성합니다.
        combobox_widget = QComboBox() # 체크 박스를 생성합니다. 
        combobox_widget.addItem("Python") #체크 박스에 "Python" 이름의 아이템을 추가 합니다.
        combobox_widget.addItem("C")
        combobox_widget.addItem("C++")
        combobox_widget.addItem("Fortran")
        combobox_widget.addItem("Basic")

        check_box_widget_summer = QCheckBox("Summer") # "Summer" 이름의 체크박스를 생성합니다.
        check_box_widget_winter = QCheckBox("Winter")

        radio_button_widget_male = QRadioButton("Male") # "Male"를 선택하는 라디오 버튼을 생성합니다.
        radio_button_widget_female = QRadioButton("Female")

        spinbox_widget = QSpinBox() # 스핀박스를 생성합니다.

        date_widget = QDateEdit() # 데이트 에딧을 생성합니다.
        time_widget = QTimeEdit() # 타임 에딧을 생성합니다. 

        list_widget = QListWidget() # 리스트 위젯을 생성합니다.
        item_1 = QListWidgetItem("Cat") #리스트 위젯에 "Cat" 이라는 아이템을 추가합니다.
        item_2 = QListWidgetItem("Dog")
        list_widget.addItem(item_1)
        list_widget.addItem(item_2)

        layout.addWidget(label_widget) #layout 레이아웃에 label_widget을 추가 합니다. 
        layout.addWidget(button_widget)
        layout.addWidget(combobox_widget)
        layout.addWidget(check_box_widget_summer)
        layout.addWidget(check_box_widget_winter)
        layout.addWidget(radio_button_widget_male)
        layout.addWidget(radio_button_widget_female)
        layout.addWidget(spinbox_widget)
        layout.addWidget(date_widget)
        layout.addWidget(time_widget)
        layout.addWidget(list_widget)

위 부분은 필요한 위젯을 하나하나 만들고, 이 위젯을 미리 만들어둔 layout 레이아웃에 추가하는 부분입니다. 

 

각 위젯은 위젯의 용도에 맞게 생성할 수 있습니다. 위젯이 모두 생성 되었다면, layout.addWidget(위젯)를 통해서 각 위젯을 layout 레이아웃에 추가 합니다. 추가한 순서대로 위에서 아래로 위젯이 배치됩니다. 

728x90