이번 장에서는 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 블로그하는프로그래머
,

pyqt5를 사용해서 gui 프로그램을 사용하는 것을 1, 2장에서 간단하게 확인하였다.

대망의 pyqt-tools 즉 designer를 사용하는 방법을 3장에서 확인해 보자.

pyqt5를 사용하는 목적이기도 한 designer는 gui 프로그램을 조금 더 쉽게 사용할 수 있는 툴입니다.

설치 방법 등은 1장에서 확인할 수 있습니다.

정독해 보세요.

https://blp1209.tistory.com/100 (1장)

 

파이썬 ui 프로그래밍 실습 feat. PyQT5, PyQT-tools(designer) 1장

파이썬으로 개발을 하다보니 윈도우나 os 의 GUI 에서 프로그래밍 하는거에 재미가 들려 공부를 해보았다. 그 내용을 포스팅 해보고 자 한다. 준비 tool : - VS CODE(개발 편집프로그램) - python 3.9 이하

blp1209.tistory.com

 

2장 https://blp1209.tistory.com/101

 

보통 vscode 터미널 창이나 windows CMD 창 등에서 designer라고 치면 프로그램이 실행이 되지만 환경변수가 잘 설정이 안 되어 있다면 아래 방법처럼 확인해 실행해 봅시다.

터미널에서 designer 실행

 

cmd 창에서 실행한 화면

설치 파일 찾아서 실행하는 방법

일반적으로는 C:\Users 아래에 자신의 폴더에 python 이 설치가 되어 있어서 이 디렉터리에서 designer.exe 프로그램을 찾아서 실행하면 됩니다.

아나콘다는 설치경로에서 확인

실행된 화면

드디어 디자이너에서 만든 폼으로 python 프로그램을 어떻게 하는지 확인해 보자.

"새 폼 - Qt Designer" 창에서 "Main Window"을 선택 하여 아무것도 없는 창을 생성 합니다.

 

 

생성 버튼 클릭하면 화면 처럼 창이 하나 생성 됩니다.

생성된 윈도우를 살펴보면 왼쪽 도구에 "위젯 상자" 윈도우 화면에 드레그앤 드랍으로 위젯을 배치 할 수 있습니다.

오른쪽에는 Object Inspector 가 위치해 있으며, 이곳에는 QMainWindow, QWidget, QMenuBar, QStatusBar 의 네 가지 클래스가 있다.

이전 장에서 메뉴, 상태 표시줄을 수동으로 생성 하였지만, Designer 도구에서 이 기능들을 자동으로 추가해 준다.

오른쪽 중간에 위치한 속성 편집기에서 중앙 위젯 개체의 지오메트리 속성을 볼 수 있다.

이것은 QWidget이며 전체 기본 윈도우의 중앙 부분이다.

메뉴바와 상태바는 각각 중앙 폼 위와 아래에 있다.

지오메트리 속성 값은 기본적으로 640 * 480으로 설정되며, 이는 코드를 그대로 실행할 때 GUI의 결과 크기가 된다.

저장을 하고 미리보기를 해본다.

폼 >미리보기 (Ctrl +  R)

메뉴바를 수정하고 .ui > .py 로 변경 해 보자.

"여기에 입력하세요" 부분에 "File" 를 입력하고 하부에 "New"를 입력 하고 저장을 한다.

디자이너에서 파일을 저장 합니다.

파일이름은 임의로 designer_test.ui 로 저장 합니다.

저장한 위치에서 명령어를 실행 합니다.

pyuic5 -x -o designer_test.py designer_test.ui

-x : 결과 Python 모듈을 실행 가능하게 합니다.

-o : 출력 파일의 이름을 지정 합니다.

pyuic5 유틸리티는 둘 이상의 .ui 파일을 하나의 .py 파일로 변환하는 기능을 제공 하기에 참고 하기 바란다.

파일 생성 확인 합니다.

변환된 디자이너 코드를 확인해 봅시다.

상단 내용에서는 인코딩내용과, pyqt5 버전, ui 파일이 어떤 파일이었는지 등을 확인 할 수 있습니다.

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'designer_test.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.

import 문을 확인 해 보자

QtCore, QtGui, QtWidgets 을 참조하는 것을 확인 할 수 있다. 

from PyQt5 import QtCore, QtGui, QtWidgets

생성된 첫 번째 메서드를 보자

setupUi 가 MainWindow를 참조 하는 것을 확인 합니다.

setupUi메서드에 포함된 코드는 생성된 이름을 통해 클래스 속성에 엑세스 할 수 있기 때문에 매우 중요합니다.

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(640, 480)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 31))
        self.menubar.setObjectName("menubar")
        self.menuNew = QtWidgets.QMenu(self.menubar)
        self.menuNew.setObjectName("menuNew")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.actionFile = QtWidgets.QAction(MainWindow)
        self.actionFile.setObjectName("actionFile")
        self.menuNew.addAction(self.actionFile)
        self.menubar.addAction(self.menuNew.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

두번째 메서드를 확인해 보자.

UI 디자인 단계에서 추가한 메뉴와 메뉴 항목 이름을 확인할 수 있습니다.

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.menuNew.setTitle(_translate("MainWindow", "New"))
        self.actionFile.setText(_translate("MainWindow", "File"))

 

마지막 _main__ 섹션을 살펴 보자.

pyuic5 변환중, -x 옵션 지정을 통해서 자동으로 생성되는 코드 입니다.

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_())

코드를 실행해 보면 윈도우가 실행 되는것을 볼 수 있습니다.

이 장에서는 Designer 에서 윈도우를 디자인 하고 Python 파일로 변환하여 실행하는 것까지 확인을 했습니다.

다음 장에서는 조금더 심화하여 접근해 보도록 하겠습니다.

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

파이썬 ui 프로그래밍 실습 1장에서 작성한 코드를 객체지향 코드로 변경을 해보도록 하겠습니다.

1장 링크 : https://blp1209.tistory.com/100

 

파이썬 ui 프로그래밍 실습 feat. PyQT5, PyQT-tools(designer) 1장

파이썬으로 개발을 하다보니 윈도우나 os 의 GUI 에서 프로그래밍 하는거에 재미가 들려 공부를 해보았다. 그 내용을 포스팅 해보고 자 한다. 준비 tool : - VS CODE(개발 편집프로그램) - python 3.9 이하

blp1209.tistory.com

 

1장의 내용을 객체지향 코드로 전환 하면 아래와 같이 변경이 가능 합니다.

#pyqt5_example_re.py

# 명령행 인수를 GUI에 전달할 수 있도록 sys를 import 한다.
import sys  
# PyQt5 패키지에서 QtWidgets 모듈에 있는 QApplication 및 QWidget 클래스를 import 한다.
from PyQt5.QtWidgets import QApplication, QWidget  

# QWidget을 상속하는 클래스를 만든다.
class GUI(QWidget):
    def __init__(self) :
        super().__init__()
        # 윈도우를 생성하고 슈퍼클래스를 초기화 한다.
        self.initUI()

    def initUI(self):
        # 타이틀을 변경 합니다.
        self.setWindowTitle('PyQt5 GUI')

# 셀프 테스팅 코드를 추가 한다.
if __name__ == '__main__':
    # 추가 명령행 이수를 전달할 수 있도록 sys.argv로 전달해 QApplication 클래스의 인스턴스를 생성 한다.
    # 이 인스턴스를 app 변수에 저장 한다.
    # 이렇게 하면 애플리케이션이 만들어 진다.
    app = QApplication(sys.argv)
    # QWidget 클래스의 인스턴스를 만들고 GUI가 된다.
    # 이 인스턴스를 gui라는 로컬 변수에 저장 한다.
    gui = GUI()

    # GUI를 볼 수 있도록 gui 클래스 인스턴스의 show 메서드를 호출한다.
    gui.show()
    # 어블리케이션 클래스 인스턴스에서 exec_ 메서드를 호출해 애플리케이션을 실행한다.
    # 발생할 수 있는 예외 사항을 파악하기 위해 호출을 sys.exit 내에 래핑 한다.
    # 에외가 발생하면 파이썬 애플리 케이션이 정상적으로 종료 되고 충돌하지 않는다.
    sys.exit(app.exec_())

 

 

추가로 QMainWindow 상속을 해 보겠습니다.

이전 소스와 다른 내용은 QWidget을 import 하지 않고 QMainWindow 를 import하여 크기 조정 한 창을 출력 할 수 있다.

#pyqt5_example_re.py

# 명령행 인수를 GUI에 전달할 수 있도록 sys를 import 한다.
import sys  
# PyQt5 패키지에서 QtWidgets 모듈에 있는 QApplication 및 QMainWindow 클래스를 import 한다.
from PyQt5.QtWidgets import QApplication, QMainWindow

# QMainWindow을 상속하는 클래스를 만든다.
class GUI(QMainWindow):
    def __init__(self) :
        super().__init__()
        # 윈도우를 생성하고 슈퍼클래스를 초기화 한다.
        self.initUI()

    def initUI(self):
        # 타이틀을 변경 합니다.
        self.setWindowTitle('PyQt5 GUI')
        self.resize(400, 300)

# 셀프 테스팅 코드를 추가 한다.
if __name__ == '__main__':
    # 추가 명령행 이수를 전달할 수 있도록 sys.argv로 전달해 QApplication 클래스의 인스턴스를 생성 한다.
    # 이 인스턴스를 app 변수에 저장 한다.
    # 이렇게 하면 애플리케이션이 만들어 진다.
    app = QApplication(sys.argv)
    # QWidget 클래스의 인스턴스를 만들고 GUI가 된다.
    # 이 인스턴스를 gui라는 로컬 변수에 저장 한다.
    gui = GUI()

    # GUI를 볼 수 있도록 gui 클래스 인스턴스의 show 메서드를 호출한다.
    gui.show()
    # 어블리케이션 클래스 인스턴스에서 exec_ 메서드를 호출해 애플리케이션을 실행한다.
    # 발생할 수 있는 예외 사항을 파악하기 위해 호출을 sys.exit 내에 래핑 한다.
    # 에외가 발생하면 파이썬 애플리 케이션이 정상적으로 종료 되고 충돌하지 않는다.
    sys.exit(app.exec_())

 

상태창 위젯을 추가해 보자.

소스에서 상태창을 추가하는 할수를 정의 하고 호출 하면 왼쪽 하단에 상태창이 이전과 다르게 발생 한다.

#pyqt5_example_re.py

# 명령행 인수를 GUI에 전달할 수 있도록 sys를 import 한다.
import sys  
# PyQt5 패키지에서 QtWidgets 모듈에 있는 QApplication 및 QMainWindow 클래스를 import 한다.
from PyQt5.QtWidgets import QApplication, QMainWindow

# QMainWindow을 상속하는 클래스를 만든다.
class GUI(QMainWindow):
    def __init__(self) :
        super().__init__()
        # 윈도우를 생성하고 슈퍼클래스를 초기화 한다.
        self.initUI()

    def initUI(self):
        # 타이틀을 변경 합니다.
        self.setWindowTitle('PyQt5 GUI')
        self.resize(400, 300)
        self.add_widgets()  # 상태창 호출

    # 상태창 위젯을 호출 하는 함수 정의
    def add_widgets(self):
        self.statusBar().showMessage('Text in statusbar')

# 셀프 테스팅 코드를 추가 한다.
if __name__ == '__main__':
    # 추가 명령행 이수를 전달할 수 있도록 sys.argv로 전달해 QApplication 클래스의 인스턴스를 생성 한다.
    # 이 인스턴스를 app 변수에 저장 한다.
    # 이렇게 하면 애플리케이션이 만들어 진다.
    app = QApplication(sys.argv)
    # QWidget 클래스의 인스턴스를 만들고 GUI가 된다.
    # 이 인스턴스를 gui라는 로컬 변수에 저장 한다.
    gui = GUI()

    # GUI를 볼 수 있도록 gui 클래스 인스턴스의 show 메서드를 호출한다.
    gui.show()
    # 어블리케이션 클래스 인스턴스에서 exec_ 메서드를 호출해 애플리케이션을 실행한다.
    # 발생할 수 있는 예외 사항을 파악하기 위해 호출을 sys.exit 내에 래핑 한다.
    # 에외가 발생하면 파이썬 애플리 케이션이 정상적으로 종료 되고 충돌하지 않는다.
    sys.exit(app.exec_())

메뉴바를 추가해 보자

QAction 을 새로 import 하고, 새로 생성 했던 add_widgets 함수에 메뉴바를 추가하는 코딩을 추가 하였다.
작성 하고 실행 하면 메뉴바가 생성 된 것을 확인 할 수 있다.
메뉴 모음의 인스턴스를 만든 후 addMenu 메서드를 사용해 메뉴를 반들었다.
QAction 클래스를 사용해 메뉴 항목ㅇㄹ 생성 한 다음 addAction 메서드를 사용해 이 메뉴 항목을 메뉴에 추가했고,
new_action 변수를 사용해 setStatusTip을 호출 했다.
File > New 를 클릭, 하면 상태바에 New File 이 보일 것 이다.
 
#pyqt5_example_re.py

# 명령행 인수를 GUI에 전달할 수 있도록 sys를 import 한다.
import sys  
# PyQt5 패키지에서 QtWidgets 모듈에 있는 QApplication 및 QMainWindow 클래스를 import 한다.
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction

# QMainWindow을 상속하는 클래스를 만든다.
class GUI(QMainWindow):
    def __init__(self) :
        super().__init__()
        # 윈도우를 생성하고 슈퍼클래스를 초기화 한다.
        self.initUI()

    def initUI(self):
        # 타이틀을 변경 합니다.
        self.setWindowTitle('PyQt5 GUI')
        self.resize(400, 300)
        self.add_widgets()  # 상태창 호출

    # 상태창 위젯을 호출 하는 함수 정의
    def add_widgets(self):
        self.statusBar().showMessage('Text in statusbar')
        menubar = self.menuBar()
        file_menu = menubar.addMenu('File')

        new_action = QAction('New', self)
        file_menu.addAction(new_action)
        new_action.setStatusTip('New File')

# 셀프 테스팅 코드를 추가 한다.
if __name__ == '__main__':
    # 추가 명령행 이수를 전달할 수 있도록 sys.argv로 전달해 QApplication 클래스의 인스턴스를 생성 한다.
    # 이 인스턴스를 app 변수에 저장 한다.
    # 이렇게 하면 애플리케이션이 만들어 진다.
    app = QApplication(sys.argv)
    # QWidget 클래스의 인스턴스를 만들고 GUI가 된다.
    # 이 인스턴스를 gui라는 로컬 변수에 저장 한다.
    gui = GUI()

    # GUI를 볼 수 있도록 gui 클래스 인스턴스의 show 메서드를 호출한다.
    gui.show()
    # 어블리케이션 클래스 인스턴스에서 exec_ 메서드를 호출해 애플리케이션을 실행한다.
    # 발생할 수 있는 예외 사항을 파악하기 위해 호출을 sys.exit 내에 래핑 한다.
    # 에외가 발생하면 파이썬 애플리 케이션이 정상적으로 종료 되고 충돌하지 않는다.
    sys.exit(app.exec_())

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

파이썬으로 개발을 하다보니 윈도우나 os 의 GUI 에서 프로그래밍 하는거에 재미가 들려 공부를 해보았다.

그 내용을 포스팅 해보고 자 한다.

준비 tool :

- VS CODE(개발 편집프로그램)

- python 3.9 이하 버전 3.10 부터는 2022-01-27 기준 지원이 안됩니다.

    - https://www.python.org/downloads/

 

Download Python

The official home of the Python Programming Language

www.python.org

- pyqt5 설치 

    - pip install pyqt5

- pyqt5-tools 설치

   - pip install pyqt5-tools

 

위에 내용을 전부 설치 했다면 vscode 에서 터미널을 열고 버전과 설치 확인을 합니다.

vscode 터미널 여는 단축키 : ctrl + shift + `

명령어 : python --version

pyqt5, pyqt5-tools 설치 확인

명령어 : pip list (pip 설치된 리스트 출력 한다.)

 

간단한 화면 출력 프로그램밍을 해봅니다.

#pyqt5_example.py

# 명령행 인수를 GUI에 전달할 수 있도록 sys를 import 한다.
import sys  
# PyQt5 패키지에서 QtWidgets 모듈에 있는 QApplication 및 QWidget 클래스를 import 한다.
from PyQt5.QtWidgets import QApplication, QWidget  

# 추가 명령행 이수를 전달할 수 있도록 sys.argv로 전달해 QApplication 클래스의 인스턴스를 생성 한다.
# 이 인스턴스를 app 변수에 저장 한다.
# 이렇게 하면 애플리케이션이 만들어 진다.
app = QApplication(sys.argv)
# QWidget 클래스의 인스턴스를 만들고 GUI가 된다.
# 이 인스턴스를 gui라는 로컬 변수에 저장 한다.
gui = QWidget()
# GUI를 볼 수 있도록 gui 클래스 인스턴스의 show 메서드를 호출한다.
gui.show()
# 어블리케이션 클래스 인스턴스에서 exec_ 메서드를 호출해 애플리케이션을 실행한다.
# 발생할 수 있는 예외 사항을 파악하기 위해 호출을 sys.exit 내에 래핑 한다.
# 에외가 발생하면 파이썬 애플리 케이션이 정상적으로 종료 되고 충돌하지 않는다.
sys.exit(app.exec())
 

 

타이틀을 변경 해 봅니다.

코드 중간에 gui.setWindowTitle('PyQt5 GUI'코드를 추가 하여 gui 의 타이틀을 변경 합니다.

#pyqt5_example.py

# 명령행 인수를 GUI에 전달할 수 있도록 sys를 import 한다.
import sys  
# PyQt5 패키지에서 QtWidgets 모듈에 있는 QApplication 및 QWidget 클래스를 import 한다.
from PyQt5.QtWidgets import QApplication, QWidget  

# 추가 명령행 이수를 전달할 수 있도록 sys.argv로 전달해 QApplication 클래스의 인스턴스를 생성 한다.
# 이 인스턴스를 app 변수에 저장 한다.
# 이렇게 하면 애플리케이션이 만들어 진다.
app = QApplication(sys.argv)
# QWidget 클래스의 인스턴스를 만들고 GUI가 된다.
# 이 인스턴스를 gui라는 로컬 변수에 저장 한다.
gui = QWidget()

# 타이틀을 변경 합니다.
gui.setWindowTitle('PyQt5 GUI')

# GUI를 볼 수 있도록 gui 클래스 인스턴스의 show 메서드를 호출한다.
gui.show()
# 어블리케이션 클래스 인스턴스에서 exec_ 메서드를 호출해 애플리케이션을 실행한다.
# 발생할 수 있는 예외 사항을 파악하기 위해 호출을 sys.exit 내에 래핑 한다.
# 에외가 발생하면 파이썬 애플리 케이션이 정상적으로 종료 되고 충돌하지 않는다.
sys.exit(app.exec())
 

2장에서는 객체지향 코드로 변경 해 보도록 하겠습니다.

파이썬 ui 프로그래밍 실습 feat. PyQT5, PyQT-tools(designer)

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