0530 PyQT GUI

lnglog·2022년 5월 30일
0
post-thumbnail

1. 학습내용

PyQT5

C#과 비슷하다고 하는 이유는 C++ 라이브러리이자 개발툴이라 그렇다.
PYQT 공식문서를 확인하는 것이 좋다.
라이센스를 확인해야하는데, 상업성을 띄면 비용을 지불해야하기 때문에
상업적으로 만들려면 PySide를 활용한다.

PyQT GUI 프로그램

import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp, QFileDialog, QPushButton, QLabel

# QtCore 모듈의 QCoreApplication 클래스 가져 오기
from PyQt5.QtCore import QCoreApplication


class MyApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):

        # 아이콘 추가
        self.setWindowIcon(QIcon("./web.png"))

        # 프레임 만들기
        # setWindowTitle -> 타이틀바에 나타는 창의 제목
        self.setWindowTitle("My First Application !!")
        self.move(300, 300)
        self.resize(400, 200)

        # 상태바 초기값 설정
        self.statusBar().showMessage("준비중....")

        # 푸쉬 버튼 만들기
        # 상태창 테스트를 위한 label 추가 초기값 설정
        self.label = QLabel('0000000000', self)
        self.move(40, 40)
        # 상태창 테스트를 위한 Start 버튼 생성 설정
        self.pb = QPushButton("Start", self)
        self.pb.clicked.connect(self.count_number)
        self.pb.move(150, 40)

        # 메뉴바 만들기
        exitAction = QAction('&Exit', self)
        loadefile = QAction('loade file ... ', self)
        savefile = QAction('save file....', self)
        # 단축키
        exitAction.setShortcut('Ctrl+q')
        exitAction.setStatusTip("Exit application")
        exitAction.triggered.connect(qApp.quit)
        loadefile.triggered.connect(self.add_open)
        savefile.triggered.connect(self.add_save)

        menuber = self.menuBar()

        # 추가
        fileMenu = menuber.addMenu('&File')
        fileMenu.addAction(exitAction)
        fileMenu.addAction(loadefile)
        fileMenu.addAction(savefile)

        self.show()

    def add_open(self):
        FileOpen = QFileDialog.getOpenFileName(self, 'Open file ', './')
        print(FileOpen)

    def add_save(self):
        FileSave = QFileDialog.getSaveFileName(self, 'Save file', './')
        print(FileSave)

    def count_number(self):
        """
        상태바 테스트 함수 
        """
        # 상태바 생성 코드
        self.statusBar().showMessage("작업중....")
        """
        PyQt5를 쓰면서 데이터가 계속 업데이트 되지 않을 때 반드시 repaint() 부분을 추가 해주세요 .. 
        """
        self.statusBar().repaint()
        for i in range(1, 100000):
            print(i)
            self.label.setText(str(i))
            self.label.repaint()

        self.statusBar().showMessage("준비중....")


if __name__ == "__main__":
    # 모든 PyQt5 어플리케이션은 어플리케이션 객체 생성
    app = QApplication(sys.argv)
    ex = MyApp()
    sys.exit(app.exec_())

box layout

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QVBoxLayout

"""
구성
창의 가운데 아래에 두 개의 버튼을 배치
두개의 버튼은 창의 크기를 변화시켜도 같은 자리에 위치합니다. 
"""


class MyApp(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):

        # 두개의 버튼 만들기
        okButton = QPushButton('ok')
        cancelButton = QPushButton('Cancel')

        """
            수평 박스를 하나 만들고, 두개의 버튼과 양쪽에 빈 공간 추가 합니다. 
            addStretch() 메서드는 신축성있는 빈공간을 제공합니다
            두 버튼 양쪽의 stretch factor 1로 같기 떄문에 이 두 빈공간의 크기는 창의 크기가 변화해도 항상 동일 
        """
        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(okButton)
        hbox.addWidget(cancelButton)
        hbox.addStretch(1)

        vbox = QVBoxLayout()
        vbox.addStretch(3)
        vbox.addLayout(hbox)
        vbox.addStretch(1)

        # 최종적으로 수직 박스를 창의 메인 레이어아웃으로 설정
        self.setLayout(vbox)
        self.setWindowTitle("Box Layout")
        self.setGeometry(300, 300, 300, 200)
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    sys.exit(app.exec_())

slider

from PyQt5.QtWidgets import QWidget, QSlider, QHBoxLayout, QLabel, QApplication
from PyQt5.QtCore import Qt

import sys


class MyApp(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        hbox = QHBoxLayout()

        sld = QSlider(Qt.Vertical, self)
        sld.setFocusPolicy(Qt.NoFocus)

        sld.setRange(0, 100)
        sld.setPageStep(5)
        sld.valueChanged.connect(self.changeValue)

        self.label = QLabel("0", self)
        self.label.setStyleSheet(
            "Qlabel { background: #007AA5; border-radius : 3px;}")
        self.label.setAlignment(Qt.AlignCenter | Qt.AlignVCenter)
        self.label.setMinimumWidth(80)

        hbox.addStretch()
        hbox.addWidget(sld)
        hbox.addSpacing(15)
        hbox.addWidget(self.label)
        hbox.addStretch()

        self.setLayout(hbox)

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle("QSlider")
        self.show()

    def changeValue(self, value):

        self.label.setText(str(value))


def main():

    app = QApplication(sys.argv)
    ex = MyApp()
    sys.exit(app.exec_())


if __name__ == "__main__":

    main()

2. 중요내용

MVC 패턴 (Model View Controller)

  • 모델 : DATA, 정보들의 가공을 책임지는 컴포넌트
  • 뷰 : 사용자에게 보여지는 부분, 유저 인터페이스를 의미
  • 컨트롤러 : 모델과 뷰 사이를 이어주는 브릿지 역할을 의미
  • 왜 사용하는가?
    '유지보수의 편리성'
    결합도가 높아진 시스템은 유지보수 작업 시 다른 비즈니스 로직에 영향을 미치게 되므로 사소한 코드의 변경이 의도치 않은 버그를 유발할 수 있다.


3. 학습소감

PyQT 프로그램을 만들기 위해 수업시간에 간단한 기능들에 대해 배웠지만
다양한 기능들을 구현하기 위한 사이드 바, 버튼 등 많은 속성들이 존재했다.
이를 쉽게 구현하려면 공식문서를 확인하는 것이 가장 좋을 것 같다는 생각이 들었다.

0개의 댓글