산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> python

예제가 있는 PyQt5 자습서:Python에서 PyQt를 사용하여 GUI 설계

PyQt란 무엇입니까?

PyQt 오픈 소스 위젯 툴킷 Qt의 파이썬 바인딩으로, 플랫폼 간 애플리케이션 개발 프레임워크로도 기능합니다. Qt는 모든 주요 데스크탑, 모바일 및 임베디드 플랫폼(Linux, Windows, MacOS, Android, iOS, Raspberry Pi 등 지원)용 GUI 애플리케이션을 작성하기 위한 인기 있는 C++ 프레임워크입니다.

PyQt는 영국에 기반을 둔 회사인 Riverbank Computing에서 개발 및 유지 관리하는 무료 소프트웨어인 반면 Qt는 The Qt Company라는 핀란드 회사에서 개발합니다.

이 PyQt5 자습서에서는 다음을 배우게 됩니다.

PyQT의 기능

다음은 PyQt의 중요한 기능입니다.

다음과 같은 다양한 기능을 다루는 600개 이상의 클래스로 구성된 PyQt 알아보기

이러한 기능을 결합하여 고급 UI 및 독립 실행형 응용 프로그램을 만들 수 있습니다. 모든 산업 분야의 많은 주요 회사에서 Qt를 사용합니다. LG, Mercedes, AMD, Panasonic, Harman 등을 예로 들 수 있습니다.

PyQt 버전

PyQt는 PyQt4 및 PyQt5의 두 가지 버전으로 제공됩니다. PyQt4는 Qt 프레임워크의 4.x 및 5.x 버전을 바인딩하기 위한 글루 코드를 제공하는 반면 PyQt5는 5.x 버전에만 바인딩을 제공합니다. 결과적으로 PyQt5는 이전 버전의 더 이상 사용되지 않는 모듈과 역호환되지 않습니다. 이 Qt GUI 튜토리얼에서는 PyQt5가 예제 데모에 사용됩니다. 이 두 가지 버전 외에도

Riverbank Computing은 또한 Qt3D 프레임워크를 위한 파이썬 바인딩인 PyQt3D를 제공합니다. Qt3D는 2D/3D 렌더링으로 실시간 시뮬레이션 시스템을 만드는 데 사용되는 응용 프로그램 프레임워크입니다.

PyQt5 설치 방법

이 PyQt5 자습서에서는 PyQt를 설치하는 두 가지 방법을 볼 수 있습니다.

Qt(귀엽다고 발음함)는 복잡한 시스템이며 PyQt 코드베이스에는 컴파일된 C++ 및 Python 코드가 포함되어 있습니다. 결과적으로 다른 파이썬 라이브러리에 비해 소스에서 빌드하고 설치하는 것이 복잡한 과정입니다. 그러나 바퀴를 사용하여 PyQt5를 쉽게 설치할 수 있습니다.

바퀴로 설치

Wheels는 새로운 표준 Python 패키징 및 배포 형식입니다. 간단히 말해서 휠은 특별한 이름과 .whl 이 있는 ZIP 아카이브입니다. 파일 확장자. 최신 버전의 Python에 기본적으로 포함되어 있는 pip(Python의 패키지 관리자)를 사용하여 휠을 설치할 수 있습니다.

따라서 Python 3.4 이상이 설치되어 있으면 이미 pip가 있습니다. 그러나 이전 버전의 Python을 사용하는 경우 계속 진행하기 전에 pip를 다운로드하여 설치해야 합니다. 다음 링크에서 지침을 검색할 수 있습니다. https://pypi.org/project/pip/.

PyQt5를 설치하려면

1단계) 명령 프롬프트를 엽니다.
Windows 컴퓨터에서 명령 프롬프트 또는 PowerShell을 엽니다.

2단계) 다음을 입력하십시오.

 pip install PyQt5

3단계) 설치에 성공했습니다.
이 PyQt5 자습서의 이 단계에서는 PyQt5 whl 패키지(약 50MB)를 다운로드하여 시스템에 설치합니다.

또는 컴퓨터에 설치된 Python 버전에 대한 Windows 바이너리를 다운로드할 수도 있습니다.

완료되면 이 PyQt5 자습서의 다음 섹션으로 진행하여 첫 번째 GUI 앱을 작성합니다.

기본 PyQt 개념 및 프로그램

이제 컴퓨터에 PyQt5를 성공적으로 설치했으므로 Python GUI 디자인 응용 프로그램을 작성할 준비가 되었습니다.

이 PyQt5 자습서에서 화면에 빈 창을 표시하는 간단한 앱부터 시작하겠습니다.

파이썬 IDLE을 실행하고 다음을 입력하십시오:

프로그램 1

import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = QWidget()
    w.resize(300,300)
    w.setWindowTitle("Guru99")
    w.show()
    sys.exit(app.exec_())

app.py로 저장하고(이름은 중요하지 않음) F5 키를 눌러 프로그램을 실행합니다. 또는 저장된 파일을 두 번 클릭하여 응용 프로그램을 실행합니다. 모든 작업을 올바르게 수행했다면 아래와 같이 Guru99라는 제목의 새 창이 열립니다.

엄청난! 작동 중입니다. 많지는 않지만 기본적인 내용을 파악하기에 충분합니다. 이제 이 PyQt 튜토리얼에서 프로그램의 각 라인이 하는 일을 자세히 살펴보겠습니다.

from PyQt5.QtWidgets import QApplication, QWidget

이 명령문은 GUI를 생성하는 데 필요한 모든 모듈을 현재 네임스페이스로 가져옵니다. QtWidgets 모듈에는 이 Python Qt 튜토리얼에서 사용할 모든 주요 위젯이 포함되어 있습니다.

app = QApplication(sys.argv)

여기에서 QApplication 클래스의 객체를 생성하고 있습니다. 이 단계는 PyQt5의 필수 단계입니다. 모든 UI 앱은 일종의 앱 진입점으로 QApplication의 인스턴스를 생성해야 합니다. 생성하지 않으면 오류가 표시됩니다.

sys.argv는 셸을 통해 실행하거나 인터페이스를 자동화하는 동안 애플리케이션에 전달할 수 있는 명령줄 매개변수 목록입니다.

이 PyQt5 예제에서는 QApplications에 인수를 전달하지 않았습니다. 따라서 sys 모듈을 가져올 필요도 없이 아래 코드로 대체할 수도 있습니다.

app = QApplication([])
w = QWidget()

다음으로 QWidget 클래스의 객체를 만듭니다. QWidget은 Qt의 모든 UI 객체의 기본 클래스이며 앱에서 보는 거의 모든 것이 위젯입니다. 여기에는 대화 상자, 텍스트, 버튼, 막대 등이 포함됩니다. 복잡한 사용자 인터페이스를 디자인할 수 있는 기능은 위젯을 중첩할 수 있다는 것입니다. 다음 섹션에서 이것이 실제로 작동하는 것을 볼 수 있습니다.

w.resize(300,300)

QWidget 클래스의 크기 조정 방법을 사용하면 모든 위젯의 크기를 설정할 수 있습니다. 이 경우 창 크기를 300x300px로 조정했습니다.

여기에서 위젯은 함께 중첩될 수 있다는 점을 기억해야 합니다. 가장 바깥쪽 위젯(즉, 부모가 없는 위젯)을 창이라고 합니다.

w.setWindowTitle("Guru99")

setWindowTitle() 메서드를 사용하면 창 제목을 전달한 문자열로 설정하는 인수로 문자열을 전달할 수 있습니다. PyQt5 예에서 제목 표시줄에는 Guru99가 표시됩니다.

w.show()

show()는 단순히 모니터 화면에 위젯을 표시합니다.

sys.exit(app.exec_())

app.exec_() 메서드는 Qt/C++ 이벤트 루프를 시작합니다. 아시다시피 PyQt는 대부분 C++로 작성되었으며 이벤트 루프 메커니즘을 사용하여 병렬 실행을 구현합니다. app.exec_()는 사용자가 GUI에서 응용 프로그램을 닫을 때만 응용 프로그램을 종료하는 Qt에 제어를 전달합니다. 이것이 ctrl+c가 다른 파이썬 프로그램에서처럼 응용 프로그램을 종료하지 않는 이유입니다. Qt가 앱을 제어하기 때문에 Python 이벤트는 애플리케이션 내에서 설정하지 않는 한 처리되지 않습니다. 또한 exec 메소드 이름에 밑줄이 있다는 점에 유의하십시오. exec()가 이미 파이썬에서 키워드였고 밑줄이 이름 충돌을 해결하기 때문입니다.

빈 창 너머

이전 섹션에서 Qt에서 기본 위젯을 만드는 방법을 보았습니다. 이제 사용자가 진정으로 상호 작용할 수 있는 보다 복잡한 인터페이스를 만들어야 할 때입니다. 다시 IDLE을 실행하고 다음을 작성하십시오.

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox

def dialog():
    mbox = QMessageBox()

    mbox.setText("Your allegiance has been noted")
    mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru")
    mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
            
    mbox.exec_()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = QWidget()
    w.resize(300,300)
    w.setWindowTitle("Guru99")
    
    label = QLabel(w)
    label.setText("Behold the Guru, Guru99")
    label.move(100,130)
    label.show()

    btn = QPushButton(w)
    btn.setText('Beheld')
    btn.move(110,150)
    btn.show()
    btn.clicked.connect(dialog)

    
    w.show()
    sys.exit(app.exec_())

파일을 appone.py 또는 원하는 파일로 저장하고 F5 키를 눌러 프로그램을 실행합니다. 실수가 없다면 IDLE은 아래와 같이 일부 텍스트와 버튼이 있는 새 창을 엽니다.

  1. 첫 번째 창에서 버튼을 클릭하면 작성한 텍스트가 포함된 새 메시지 상자가 열립니다.
  2. 이제 세부정보 숨기기/세부정보 표시 버튼을 클릭하여 추가 텍스트의 가시성을 전환할 수 있습니다.

보시다시피 메시지 ​​상자에 창 제목을 설정하지 않았기 때문에 기본 제목은 python 자체에서 제공했습니다.

이제 작동하므로 이전 PyQt5 예제에 추가한 추가 코드를 살펴보겠습니다.

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox

이렇게 하면 PyQt5 예제에서 사용한 몇 가지 위젯, 즉 QLabel, QPushButton 및 QMessageBox가 추가로 가져옵니다.

def dialog():
    mbox = QMessageBox()

    mbox.setText("Your allegiance has been noted")
    mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru")
    mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
            
    mbox.exec_()

여기에서 메시지 상자 위젯을 생성하고 일부 텍스트를 버튼 및 기타 필드에 설정하는 dialog라는 메서드를 정의했습니다.

Dialog 메서드는 특정 위젯(이 경우 btn PushButton)에서 버튼을 눌렀을 때 프로그램의 메인 블록에서 호출됩니다. 해당 버튼에서 트리거된 클릭 이벤트로 인해 이 기능이 실행됩니다. 이러한 기능을 Qt에서는 슬롯이라고 하며 신호에 대해 자세히 알아볼 것입니다. 및 슬롯 다음 단락에서.

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = QWidget()
    w.resize(300,300)
    w.setWindowTitle("Guru99")

이것은 앱의 주요 섹션이며 이전 예에서와 같이 QApplication의 인스턴스를 생성하고 그 뒤에 간단한 위젯(예:QWidget의 인스턴스)을 생성하는 것으로 시작합니다.

label = QLabel(w)
    btn = QPushButton(w)

이 응용 프로그램에 QLabel 및 QPushButton이라는 두 개의 새 위젯을 추가했습니다. QLabel은 위젯 내부의 편집 불가능한 텍스트나 자리 표시자를 인쇄하는 데 사용되는 반면 QPushButton은 클릭 가능한 버튼을 만드는 데 사용됩니다.

여기서 주목해야 할 중요한 점은 레이블 및 btn 개체를 만들 때 창 개체(w)를 QLabel 및 QPushButton의 생성자에 전달한다는 것입니다. 이것이 PyQt5에서 중첩이 작동하는 방식입니다. 다른 위젯 내부에 위젯을 생성하려면 상위 위젯의 참조를 하위 생성자에 전달합니다.

label.move(100,130)
btn.move(110,150)

move()는 상위 위젯을 기준으로 위젯의 위치를 ​​설정하는 데 사용됩니다. 첫 번째 경우 레이블은 창의 왼쪽에서 100px, 상단에서 130px 이동됩니다.

마찬가지로 버튼은 창의 왼쪽에서 110px, 상단에서 150px에 배치됩니다. 이 예는 레이아웃을 달성하는 조잡한 방법이며 일반적으로 프로덕션에서 사용되지 않습니다. 학습 목적으로만 여기에 포함됩니다. Qt는 이 PyQt 튜토리얼의 다음 섹션에서 자세히 볼 다양한 레이아웃을 지원합니다.

btn.clicked.connect(dialog)

마지막으로 이것은 Qt의 신호 및 슬롯의 예입니다. GUI 기반 응용 프로그램에서 기능은 요소 위에 마우스를 올리거나 버튼을 클릭하는 것과 같이 사용자가 수행한 작업을 기반으로 실행됩니다. 이러한 작업을 이벤트라고 합니다. . app.exec_() 메서드가 제어를 Qt event-로 전송한다는 것을 기억하십시오. 고리. 이벤트 루프가 있는 이유는 이벤트를 수신하고 이에 대한 응답으로 작업을 수행하는 것입니다.

사용자가 버튼을 클릭하는 것과 같은 이벤트가 발생할 때마다 해당 Qt 위젯은 신호를 발생시킵니다. . 이러한 신호는 신호가 트리거될 때 함수가 실행되도록 파이썬 함수(이 예의 대화 함수와 같은)에 연결할 수 있습니다. 이러한 기능을 슬롯이라고 합니다. Qt 언어로.

이후 이벤트 신호에 대한 응답으로 슬롯 기능을 트리거하는 기본 구문은 다음과 같습니다.

 widget.signal.connect(slot)

즉, 신호위젯에 의해 실행됨 , 연결된 슬롯 기능이 실행됩니다. 요약하면 Qt는 신호와 슬롯을 사용하여 객체 간에 통신하고 구성 요소 재사용성과 상호 작용을 촉진합니다.

이제 위젯을 중첩하고 신호 및 슬롯을 사용하여 상호 작용을 구현하는 방법을 알았으므로 PyQt 앱에서 사용할 수 있는 유용한 위젯 및 기타 클래스 목록이 있습니다.

구성 요소 및 위젯

GUI 앱을 만들기 위해 PyQt에서 사용할 수 있는 위젯이 많이 있습니다. 그러나 PyQt5에서는 클래스가 다른 모듈로 재편성되고 라이선스가 수정되었습니다.

따라서 PyQt5의 구조에 대한 높은 수준의 관점을 갖는 것이 중요합니다. 이 섹션에서는 PyQt5가 내부적으로 어떻게 구성되어 있는지 살펴보고 PyQt5에서 제공하는 다양한 모듈, 라이브러리 및 API 클래스에 대해 알아봅니다.

PyQt5 디렉토리 구조

이들은 Python의 Qt 바인딩, 특히 PyQt5에서 사용하는 기본 모듈입니다.

PyQt5 위젯

다음은 PyQt5에서 가장 자주 사용되는 위젯 목록입니다.

레이아웃 및 테마

이전 PyQt5 예제에서는 GUI에서 위젯의 위치를 ​​설정하기 위해 move() 및 resize() 메서드만 사용했습니다.

그러나 PyQt에는 응용 프로그램을 위한 고급 사용자 인터페이스를 만드는 데 사용할 수 있는 강력한 레이아웃 관리 엔진이 있습니다. 이 섹션에서는 Qt에서 레이아웃을 만들고 관리하는 데 사용되는 두 가지 중요한 클래스에 대해 학습합니다.

  1. QBoxLayout
  2. QGridLayout

QBoxLayout

QBoxLayout은 레이아웃의 자식 위젯을 가로 또는 세로 행에 정렬하는 데 사용됩니다. QBoxLayout에서 상속되는 두 가지 관심 클래스는 다음과 같습니다.

예를 들어, QHBoxLayout에 정렬된 세 개의 버튼은 다음과 같습니다.

import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":

    app = QApplication([])
    w = QWidget()
    w.setWindowTitle("Musketeers")

    btn1 = QPushButton("Athos")
    btn2 = QPushButton("Porthos")
    btn3 = QPushButton("Aramis")

    hbox = QHBoxLayout(w)

    hbox.addWidget(btn1)
    hbox.addWidget(btn2)
    hbox.addWidget(btn3)

    w.show()

    sys.exit(app.exec_())

이것이 QVBoxLayout에서 보이는 방식입니다.

import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":

    app = QApplication([])
    w = QWidget()
    w.setWindowTitle("Musketeers")

    btn1 = QPushButton("Athos")
    btn2 = QPushButton("Porthos")
    btn3 = QPushButton("Aramis")

    vb = QVBoxLayout(w)

    vb.addWidget(btn1)
    vb.addWidget(btn2)
    vb.addWidget(btn3)

    w.show()

    sys.exit(app.exec_())

이 시점에서 설명이 필요한 유일한 함수는 addWidget() 메서드입니다. 위젯을 HBox 또는 VBox 레이아웃에 삽입하는 데 사용됩니다. 다음 섹션에서 볼 수 있듯이 다른 수의 매개변수를 사용하는 다른 레이아웃에서도 사용됩니다. 위젯은 삽입한 순서대로 레이아웃 안에 나타납니다.

QGridLayout

QGridLayout은 위젯이 그리드 형태(예:매트릭스 또는 2D 배열)로 배치되는 인터페이스를 만드는 데 사용됩니다. 그리드 레이아웃에 요소를 삽입하려면 매트릭스 표현을 사용하여 그리드의 행과 열 수와 해당 요소의 위치를 ​​정의할 수 있습니다.

예를 들어, 3*3 그리드(즉, 3개의 행과 3개의 열이 있는 그리드)를 생성하려면 다음 코드를 작성합니다.

Import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":
    app = QApplication([])

    w = QWidget()

    grid = QGridLayout(w)

    for i in range(3):
        for j in range(3):
            grid.addWidget(QPushButton("Button"),i,j)


    w.show()
    sys.exit(app.exec_())

출력은 다음과 같습니다.

addWidget() 메서드 그리드 레이아웃에서 다음 인수를 사용합니다.

더 잘 이해하기 위해 아래와 같이 각 위젯을 수동으로 삽입할 수 있습니다.

import sys
from PyQt5.QtWidgets import *

if __name__ == "__main__":
    app = QApplication([])

    w = QWidget()

    grid = QGridLayout(w)
    grid.addWidget(QPushButton("Button one"),0,0)
    grid.addWidget(QPushButton("Button two"),0,1)
    grid.addWidget(QPushButton("Button three"),1,0)
    grid.addWidget(QPushButton("Button four"),1,1)


    w.show()
    sys.exit(app.exec_())

그리드의 모양은 다음과 같습니다.

둘 이상의 행이나 열을 확장하기 위해 rowspan 및 colspan 매개변수를 addWidget()에 전달할 수도 있습니다.

예를 들어,

grid.addWidget(QPushButton("Button five"),2,0,1,0)

이렇게 하면 두 열에 걸쳐 확장되는 버튼이 생성됩니다.

테마

PyQt5에는 앱에서 사용할 수 있는 몇 가지 기본 제공 테마가 있습니다. setStyle() QApplication 인스턴스에서 호출된 메소드는 애플리케이션에 특정 테마를 설정하는 데 사용됩니다.

예를 들어 다음 코드 줄을 추가하면 애플리케이션의 테마가 기본값에서 Fusion으로 변경됩니다.

app.setStyle("Fusion")

이것은 이전 예제가 Fusion Theme에서 보이는 방식입니다.

앱 테마를 지정하는 또 다른 유용한 기능은 setPalette() 메서드입니다. 다음은 setPalette()를 사용하여 다른 위젯의 색상을 변경하는 코드입니다.

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPalette

if __name__ == "__main__":
    app = QApplication([])
    app.setStyle("Fusion")
    
    qp = QPalette()
    qp.setColor(QPalette.ButtonText, Qt.black)
    qp.setColor(QPalette.Window, Qt.black)
    qp.setColor(QPalette.Button, Qt.gray)
    app.setPalette(qp)

    w = QWidget()

    grid = QGridLayout(w)
    grid.addWidget(QPushButton("Button one"),0,0)
    grid.addWidget(QPushButton("Button two"),0,1)
    grid.addWidget(QPushButton("Button three"),1,0)
    grid.addWidget(QPushButton("Button four"),1,1)


    w.show()
    sys.exit(app.exec_())

결과는 다음과 같습니다.

setPalette() 메서드를 사용하려면 먼저 팔레트를 정의해야 합니다. 이것은 QPalette 클래스의 객체를 생성하여 수행됩니다.

 qp = QPalette()

QPalette 클래스는 QtGui 모듈에 속하며 이것이 작동하려면 가져와야 합니다. QPalette 객체를 생성했으면 setColor() 메서드를 사용하여 색상을 변경할 위젯의 이름과 설정하려는 색상을 전달합니다.

 qp.setColor(QPalette.Window, Qt.black)

이렇게 하면 창의 색상이 검은색으로 바뀝니다. 색 구성표를 정의한 후에는 setPalette() 함수를 사용하여 응용 프로그램에 팔레트를 적용하십시오.

app.setPalette(qp)

앱에 대한 몇 가지 기본 테마를 만들려면 이것이 전부입니다. PyQt를 사용하면 스타일시트를 사용하여 위젯의 모양을 정의할 수도 있습니다. CSS에 익숙하다면 Qt 스타일 시트를 사용하여 앱의 고급 스타일을 쉽게 정의할 수 있습니다.

요약


python

  1. 예제가 있는 C# 컬렉션 자습서
  2. 예제가 있는 Python 문자열 count()
  3. Python String format() 예제로 설명
  4. 예제가 있는 Python 문자열 find() 메서드
  5. 예제가 있는 Python Lambda 함수
  6. 예제가 있는 Python round() 함수
  7. 예제가 있는 Python map() 함수
  8. 예제가 있는 Python Timeit()
  9. 예제가 있는 컬렉션의 Python 카운터
  10. 예제가 있는 Python의 type() 및 isinstance()