이번 장에서는 pyqt 레이아웃, 텍스트레이아웃, 버튼을 살펴 보도록 하겠습니다.

tkinter 라이브러리에서 제공하는 라벨등을 배치 시키는 공간 위젯이라고 생각 하면 될 듯하다.

위치를 지정하여 UI를 디자인 하는 방법으로 많이 사용 됩니다.

자 그럼 시작해 볼까용~

4장에서 까지 생성한 .ui를 새로운이름으로 저장 합니다.

designer_test.ui -> designer_test_layout.ui

왼쪽 위젯 상자에서 Layouts 에서 가로 레이아웃을 끌어 

 

tab1 위에 2개의 가로 레이아웃을 끌어다 놓습니다.

.ui 를 .py로 변환 합니다.

pyuic5 -x -o designer_test_layouts.py designer_test_layouts.ui

4장에서 만든 .py 파일의 import 파일을 "designer_test_layouts" 로 수정 하여 실행 해 봅니다.

# designer_test_modular_quit.py

import sys
from PyQt5 import QtWidgets
from designer_test_layouts import Ui_MainWindow

# __init__ 메서드를 포함하는 새로운 파이썬 클래스를 생성 한다.
class QuitDesignerGUI():
    # 자체 파이썬 클래스를 생성한다.
    # 일반적인 이니셜라이저 부터 시작 한다.
    # 이니셜라이저 메서드가 끝날 쯤, 이니셜라이저 아래에 만들고 있는 메서드를 호출 했다.
    # 클래스를 인스턴스화만 하면 되었고, 클래스 인스턴스(개체)가 생성된 후,
    # 클래스 인스턴스에서 특정 메서드를 호출 안해도 메서드는 실행 된다.
    def __init__(self):
        app = QtWidgets.QApplication(sys.argv)
        self.MainWindow = QtWidgets.QMainWindow()
        self.ui = Ui_MainWindow()   # 윈도우의 인스턴스를 생성
        self.ui.setupUi(self.MainWindow)
        self.update_widgets()
        self.widget_actions()
        self.MainWindow.show()
        sys.exit(app.exec_())
   
    # 상태바를 업데이트하고 작업을 메뉴 항목에 연결하는 메서드를 만든다.
    # self.ui.actionQuit를 통해 메뉴 항목의 이름에 엑세스 한다.
    # self.ui는 "__init__"메서드에서 기본 윈도우의 인스턴스를 생성해 저장 했기에 사용할 수 있다.
    def widget_actions(self):
        self.ui.actionQuit.setStatusTip(
            '클릭시 윈도우가 종료 됩니다.'
        )
        # triggered.connect(<method name>) 작업이 트리거되는 메뉴 항목의 이벤트에 연결된다.(이는 PyQt5 문법 이다.)

        self.ui.actionQuit.triggered.connect(self.close_GUI)

    # GUI를 종료하는 콜백 메서드를 작성한다.
    def close_GUI(self):
        self.MainWindow.close()
   
    # GUI 타이틀을 업데이트하는 클래스 메서드를 작성한다.
    def update_widgets(self):
        self.MainWindow.setWindowTitle('PyQt5 GUI')

# __main__ 섹션을 사용해 클래스 인스턴스를 만든다. 이것이 GUI를 실행하기 위해 해야 한다.
if __name__ == "__main__":
    QuitDesignerGUI()
designer_test_layouts
designer_test_layouts

정상 작동 확인 합니다.

다음으로 버튼 추가와 텍스트 라벨 추가하는 법을 확인해 보겠습니다.

PushButton을 아래쪽 레이아웃에 드래그앤 드랍 합니다.

designer_test_layouts"

designer_test_layouts.ui -> designer_test_button.ui 로 새로운 이름으로 저장 합니다.

라벨을 위쪽 레이아웃에 추가 합니다.

pushbutton과 label을 연결 합니다.

연결하는 방법은 F4키를 눌러 signals/slots 편집모드로 들어가거나 Designer내의 Edit 메뉴를 사용 하면 됩니다.

F4누르고 PushButton 누른상태에서 드레그 하여 TextLabel에서 드랍 합니다.

그러면 연결설정 창이 팝업 화면으로 나오게 됩니다.

PushButton에서 clicked() 를 선택  Label에서는 clear()를 선택 합니다.

확인 버튼 클릭하여 윈도우를 보게 되면 빨강생 이벤트 들이 보이게 됩니다.

.ui -> .py 로 변경 합니다.

pyuic5 -x -o designer_test_button.py designer_test_button.ui

designer_test_modular_button.py 파일을 만들어서 실행해 봅니다.

# designer_test_modular_button.py

import sys
from PyQt5 import QtWidgets
from designer_test_button import Ui_MainWindow

# __init__ 메서드를 포함하는 새로운 파이썬 클래스를 생성 한다.
class QuitDesignerGUI():
    # 자체 파이썬 클래스를 생성한다.
    # 일반적인 이니셜라이저 부터 시작 한다.
    # 이니셜라이저 메서드가 끝날 쯤, 이니셜라이저 아래에 만들고 있는 메서드를 호출 했다.
    # 클래스를 인스턴스화만 하면 되었고, 클래스 인스턴스(개체)가 생성된 후,
    # 클래스 인스턴스에서 특정 메서드를 호출 안해도 메서드는 실행 된다.
    def __init__(self):
        app = QtWidgets.QApplication(sys.argv)
        self.MainWindow = QtWidgets.QMainWindow()
        self.ui = Ui_MainWindow()   # 윈도우의 인스턴스를 생성
        self.ui.setupUi(self.MainWindow)
        self.update_widgets()
        self.widget_actions()
        self.MainWindow.show()
        sys.exit(app.exec_())
   
    # 상태바를 업데이트하고 작업을 메뉴 항목에 연결하는 메서드를 만든다.
    # self.ui.actionQuit를 통해 메뉴 항목의 이름에 엑세스 한다.
    # self.ui는 "__init__"메서드에서 기본 윈도우의 인스턴스를 생성해 저장 했기에 사용할 수 있다.
    def widget_actions(self):
        self.ui.actionQuit.setStatusTip(
            '클릭시 윈도우가 종료 됩니다.'
        )
        # triggered.connect(<method name>) 작업이 트리거되는 메뉴 항목의 이벤트에 연결된다.(이는 PyQt5 문법 이다.)

        self.ui.actionQuit.triggered.connect(self.close_GUI)

    # GUI를 종료하는 콜백 메서드를 작성한다.
    def close_GUI(self):
        self.MainWindow.close()
   
    # GUI 타이틀을 업데이트하는 클래스 메서드를 작성한다.
    def update_widgets(self):
        self.MainWindow.setWindowTitle('PyQt5 GUI')

# __main__ 섹션을 사용해 클래스 인스턴스를 만든다. 이것이 GUI를 실행하기 위해 해야 한다.
if __name__ == "__main__":
    QuitDesignerGUI()

실행을 해보면 TextLabel이 PushButton 을 클릭 했을때,

clear 되는것을 확인 할 수 있습니다.

Posted by 블로그하는프로그래머
,

이전 3장에서는 Designer를 사용하여 파이썬 GUI 프로그램 디자인을 하는 방법을 살펴보았습니다.

3장 : https://blp1209.tistory.com/102

이번장에서는 만들어진 py 파일을 참조하여 모듈식으로 GUI 디자인 만드는 방법을 살펴보겠습니다.

designer_test_modular.py를 아래와 같이 만듭니다.

3장에서 만든 designer_test를 import 하여 Ui_MainWindow 클래스를 사용할 수 있게 합니다.

# designer_test_modular.py

from PyQt5 import QtWidgets
from designer_test import Ui_MainWindow

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

메뉴바 추가를 해보도록 하겠습니다.

New 메뉴 하단에 Quit 메뉴를 추가합니다.

파일을 저장하고. ui ->. py로 변경합니다.

pyuic5 -x -o designer_test.py designer_test.ui

모듈 형태의 새로운. py 파일을 생성합니다.

이름은 임의로 designer_test_modular_quit.py로 생성했습니다.

아래 코드는 메뉴에서 quit 메뉴를 클릭하면 창이 종료되는 내용입니다.

quit 메뉴에 마우스 오버가 되었을 때 상태창에서는 "클릭 시 윈도가 종료됩니다."로 표시가 됩니다.

 

# designer_test_modular_quit.py

import sys
from PyQt5 import QtWidgets
from designer_test import Ui_MainWindow

# __init__ 메서드를 포함하는 새로운 파이썬 클래스를 생성 한다.
class QuitDesignerGUI():
    # 자체 파이썬 클래스를 생성한다.
    # 일반적인 이니셜라이저 부터 시작 한다.
    # 이니셜라이저 메서드가 끝날 쯤, 이니셜라이저 아래에 만들고 있는 메서드를 호출 했다.
    # 클래스를 인스턴스화만 하면 되었고, 클래스 인스턴스(개체)가 생성된 후,
    # 클래스 인스턴스에서 특정 메서드를 호출 안해도 메서드는 실행 된다.
    def __init__(self):
        app = QtWidgets.QApplication(sys.argv)
        self.MainWindow = QtWidgets.QMainWindow()
        self.ui = Ui_MainWindow()   # 윈도우의 인스턴스를 생성
        self.ui.setupUi(self.MainWindow)
        self.update_widgets()
        self.widget_actions()
        self.MainWindow.show()
        sys.exit(app.exec_())
   
    # 상태바를 업데이트하고 작업을 메뉴 항목에 연결하는 메서드를 만든다.
    # self.ui.actionQuit를 통해 메뉴 항목의 이름에 엑세스 한다.
    # self.ui는 "__init__"메서드에서 기본 윈도우의 인스턴스를 생성해 저장 했기에 사용할 수 있다.
    def widget_actions(self):
        self.ui.actionQuit.setStatusTip(
            '클릭시 윈도우가 종료 됩니다.'
        )
        # triggered.connect(<method name>) 작업이 트리거되는 메뉴 항목의 이벤트에 연결된다.(이는 PyQt5 문법 이다.)

        self.ui.actionQuit.triggered.connect(self.close_GUI)

    # GUI를 종료하는 콜백 메서드를 작성한다.
    def close_GUI(self):
        self.MainWindow.close()
   
    # GUI 타이틀을 업데이트하는 클래스 메서드를 작성한다.
    def update_widgets(self):
        self.MainWindow.setWindowTitle('PyQt5 GUI')

# __main__ 섹션을 사용해 클래스 인스턴스를 만든다. 이것이 GUI를 실행하기 위해 해야 한다.
if __name__ == "__main__":
    QuitDesignerGUI()

 

탭 위젯을 추가하여 사용하는 방법을 알아보겠습니다.

디자이너에서 탭 위젯을 추가하고 다른 이름으로 저장을 합니다.

탭 위젯은 왼쪽 "위젯 상자"에서 "Containers" 탭에 "Tab Widget"을 선택하여 

드래그엔 드롭으로 윈도 창에 놓아둔 다음 크기를 잘 조절해 주면 됩니다.

다른이른으로 저장을 하여 "designer_test_tab. ui" 으로 저장을 합니다.

.ui ->. py로 변환을 합니다.

pyuic5 -x -o designer_test_tab.py designer_test_tab.ui

기존 코드에서 변경된. py 파일을 import 하고 실행해 보자.

# designer_test_modular_quit.py

import sys
from PyQt5 import QtWidgets
from designer_test_tab import Ui_MainWindow

# __init__ 메서드를 포함하는 새로운 파이썬 클래스를 생성 한다.
class QuitDesignerGUI():
    # 자체 파이썬 클래스를 생성한다.
    # 일반적인 이니셜라이저 부터 시작 한다.
    # 이니셜라이저 메서드가 끝날 쯤, 이니셜라이저 아래에 만들고 있는 메서드를 호출 했다.
    # 클래스를 인스턴스화만 하면 되었고, 클래스 인스턴스(개체)가 생성된 후,
    # 클래스 인스턴스에서 특정 메서드를 호출 안해도 메서드는 실행 된다.
    def __init__(self):
        app = QtWidgets.QApplication(sys.argv)
        self.MainWindow = QtWidgets.QMainWindow()
        self.ui = Ui_MainWindow()   # 윈도우의 인스턴스를 생성
        self.ui.setupUi(self.MainWindow)
        self.update_widgets()
        self.widget_actions()
        self.MainWindow.show()
        sys.exit(app.exec_())
   
    # 상태바를 업데이트하고 작업을 메뉴 항목에 연결하는 메서드를 만든다.
    # self.ui.actionQuit를 통해 메뉴 항목의 이름에 엑세스 한다.
    # self.ui는 "__init__"메서드에서 기본 윈도우의 인스턴스를 생성해 저장 했기에 사용할 수 있다.
    def widget_actions(self):
        self.ui.actionQuit.setStatusTip(
            '클릭시 윈도우가 종료 됩니다.'
        )
        # triggered.connect(<method name>) 작업이 트리거되는 메뉴 항목의 이벤트에 연결된다.(이는 PyQt5 문법 이다.)

        self.ui.actionQuit.triggered.connect(self.close_GUI)

    # GUI를 종료하는 콜백 메서드를 작성한다.
    def close_GUI(self):
        self.MainWindow.close()
   
    # GUI 타이틀을 업데이트하는 클래스 메서드를 작성한다.
    def update_widgets(self):
        self.MainWindow.setWindowTitle('PyQt5 GUI')

# __main__ 섹션을 사용해 클래스 인스턴스를 만든다. 이것이 GUI를 실행하기 위해 해야 한다.
if __name__ == "__main__":
    QuitDesignerGUI()

탭이 생성되었고 같은 윈도에서 tab으로 구분 지어 화면을 달리 사용할 수 있게 되었다.

이것으로 4장을 마치고 5장에서 뵙도록 하겠습니다.

Posted by 블로그하는프로그래머
,