Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Python

PyQt5-Tutorial mit Beispielen:Entwerfen Sie eine GUI mit PyQt in Python

Was ist PyQt?

PyQt ist eine Python-Anbindung des Open-Source-Widget-Toolkits Qt, das auch als plattformübergreifendes Anwendungsentwicklungs-Framework fungiert. Qt ist ein beliebtes C++-Framework zum Schreiben von GUI-Anwendungen für alle wichtigen Desktop-, Mobil- und Embedded-Plattformen (unterstützt Linux, Windows, MacOS, Android, iOS, Raspberry Pi und mehr).

PyQt ist eine kostenlose Software, die von Riverbank Computing, einem in England ansässigen Unternehmen, entwickelt und gepflegt wird, während Qt von einer finnischen Firma namens The Qt Company entwickelt wird.

In diesem PyQt5-Tutorial lernen Sie:

Funktionen von PyQT

Hier sind wichtige Funktionen von PyQt:

Lernen Sie PyQt kennen, das aus mehr als 600 Klassen besteht, die eine Reihe von Funktionen wie

abdecken

Diese Funktionen können kombiniert werden, um erweiterte Benutzeroberflächen sowie eigenständige Anwendungen zu erstellen. Viele große Unternehmen aus allen Branchen verwenden Qt. Einige Beispiele sind LG, Mercedes, AMD, Panasonic, Harman usw.

PyQt-Versionen

PyQt ist in zwei Editionen verfügbar, PyQt4 und PyQt5. PyQt4 bietet Glue-Code zum Binden von 4.x- und 5.x-Versionen des Qt-Frameworks, während PyQt5 nur eine Bindung für die 5.x-Versionen bereitstellt. Daher ist PyQt5 nicht abwärtskompatibel mit den veralteten Modulen der älteren Version. In diesem Qt-GUI-Tutorial wird PyQt5 für die Demonstration von Beispielen verwendet. Abgesehen von diesen beiden Versionen,

Riverbank Computing bietet auch PyQt3D – die Python-Bindungen für das Qt3D-Framework. Qt3D ist ein Anwendungsframework zum Erstellen von Echtzeit-Simulationssystemen mit 2D/3D-Rendering.

Wie installiert man PyQt5

In diesem PyQt5-Tutorial werden wir die zwei Möglichkeiten zur Installation von PyQt sehen:

Qt (ausgesprochen süß) ist ein komplexes System, und die PyQt-Codebasis enthält kompilierten C++- und Python-Code unter der Haube. Infolgedessen ist es im Vergleich zu anderen Python-Bibliotheken ein komplizierter Prozess, es aus der Quelle zu erstellen und zu installieren. Sie können PyQt5 jedoch problemlos mithilfe von Rädern installieren.

Installation mit Rädern

Wheels sind das neue standardmäßige Verpackungs- und Verteilungsformat von Python. Einfach gesagt ist ein Rad ein ZIP-Archiv mit einem speziellen Namen und .whl Dateierweiterung. Wheels kann mit pip (dem Paketmanager von Python) installiert werden, der standardmäßig in den neueren Versionen von Python enthalten ist.

Wenn Sie also Python 3.4 oder höher installiert haben, haben Sie Pip bereits. Wenn Sie jedoch eine ältere Version von Python verwenden, müssen Sie pip herunterladen und installieren, bevor Sie fortfahren. Sie können unter diesem Link nach Anweisungen dafür suchen:https://pypi.org/project/pip/.

Um PyQt5 zu installieren,

Schritt 1) ​​ Eingabeaufforderung öffnen.
Öffnen Sie die Eingabeaufforderung oder PowerShell auf Ihrem Windows-Rechner.

Schritt 2) Geben Sie Folgendes ein.

 pip install PyQt5

Schritt 3) Installation erfolgreich.
Dieser Schritt in diesem PyQt5-Tutorial lädt das PyQt5 whl-Paket (ca. 50 MB) herunter und installiert es auf Ihrem System.

Alternativ können Sie auch eine Windows-Binärdatei für die auf Ihrem Computer installierte Python-Version herunterladen.

Sobald es fertig ist, fahren Sie mit dem nächsten Abschnitt in diesem PyQt5-Tutorial fort, um Ihre erste GUI-App zu schreiben.

Grundlegende PyQt-Konzepte und -Programme

Nachdem Sie PyQt5 nun erfolgreich auf Ihrem Computer installiert haben, können Sie Python-GUI-Designanwendungen schreiben.

Beginnen wir mit einer einfachen App in diesem PyQt5-Tutorial, die ein leeres Fenster auf Ihrem Bildschirm anzeigt.

Starten Sie Ihren Python IDLE und geben Sie Folgendes ein:

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

Speichern Sie es als app.py (der Name spielt keine Rolle) und drücken Sie F5, um das Programm auszuführen. Alternativ doppelklicken Sie einfach auf Ihre gespeicherte Datei, um die Anwendung zu starten. Wenn Sie alles richtig gemacht haben, öffnet sich ein neues Fenster mit dem Titel Guru99 wie unten gezeigt.

Groß! Es funktioniert. Es ist nicht viel, aber es reicht, um die Grundlagen zu verstehen. Lassen Sie uns nun in diesem PyQt-Tutorial im Detail sehen, was jede der Zeilen in Ihrem Programm tut.

from PyQt5.QtWidgets import QApplication, QWidget

Diese Anweisung importiert alle Module, die Sie zum Erstellen einer GUI in den aktuellen Namensraum benötigen. Das QtWidgets-Modul enthält alle wichtigen Widgets, die Sie in diesem Python-Qt-Tutorial verwenden werden.

app = QApplication(sys.argv)

Hier erstellen Sie ein Objekt der QApplication-Klasse. Dieser Schritt ist eine Notwendigkeit für PyQt5; Jede UI-App muss eine Instanz von QApplication als eine Art Einstiegspunkt in die App erstellen. Wenn Sie es nicht erstellen, werden Fehler angezeigt.

sys.argv ist die Liste der Befehlszeilenparameter, die Sie an die Anwendung übergeben können, wenn Sie sie über die Shell starten oder die Schnittstelle automatisieren.

In diesem PyQt5-Beispiel haben Sie keine Argumente an QApplications übergeben. Daher können Sie es auch durch den folgenden Code ersetzen und müssen nicht einmal das sys-Modul importieren.

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

Als nächstes erstellen wir ein Objekt der QWidget-Klasse. QWidget ist die Basisklasse aller UI-Objekte in Qt, und praktisch alles, was Sie in einer App sehen, ist ein Widget. Dazu gehören Dialoge, Texte, Schaltflächen, Balken und so weiter. Die Funktion, mit der Sie komplexe Benutzeroberflächen entwerfen können, besteht darin, dass die Widgets verschachtelt werden können, d. h. Sie können ein Widget in einem Widget haben, das wiederum in einem anderen Widget enthalten ist. Sie werden dies im nächsten Abschnitt in Aktion sehen.

w.resize(300,300)

Mit der resize-Methode der QWidget-Klasse können Sie die Abmessungen eines beliebigen Widgets festlegen. In diesem Fall haben Sie die Größe des Fensters auf 300 x 300 Pixel geändert.

Hier sollten Sie daran denken, dass Widgets ineinander verschachtelt werden können, das äußerste Widget (d. h. das Widget ohne übergeordnetes Element) wird als Fenster bezeichnet.

w.setWindowTitle("Guru99")

Mit der Methode setWindowTitle() können Sie einen String als Argument übergeben, der den Titel des Fensters auf den übergebenen String setzt. Im PyQt5-Beispiel zeigt die Titelleiste Guru99.

an
w.show()

show() zeigt einfach das Widget auf dem Bildschirm an.

sys.exit(app.exec_())

Die Methode app.exec_() startet die Qt/C++-Ereignisschleife. Wie Sie wissen, ist PyQt größtenteils in C++ geschrieben und verwendet den Ereignisschleifenmechanismus, um die parallele Ausführung zu implementieren. app.exec_() übergibt die Kontrolle an Qt, das die Anwendung nur beendet, wenn der Benutzer sie über die GUI schließt. Aus diesem Grund beendet Strg+C die Anwendung nicht wie in anderen Python-Programmen. Da Qt die Kontrolle über die App hat, werden Python-Ereignisse nicht verarbeitet, es sei denn, wir richten sie innerhalb der Anwendung ein. Beachten Sie auch, dass die exec-Methode einen Unterstrich im Namen hat; Dies liegt daran, dass exec() bereits ein Schlüsselwort in Python war und der Unterstrich den Namenskonflikt auflöst.

Jenseits leerer Fenster

Im vorherigen Abschnitt haben Sie gesehen, wie Sie ein einfaches Widget in Qt erstellen. Es ist jetzt an der Zeit, einige kompliziertere Schnittstellen zu erstellen, mit denen die Benutzer wirklich interagieren können. Starten Sie erneut Ihren IDLE und schreiben Sie Folgendes.

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

Speichern Sie die Datei als appone.py oder was auch immer Sie möchten und drücken Sie F5, um das Programm auszuführen. Wenn Sie keine Fehler gemacht haben, öffnet IDLE ein neues Fenster mit etwas Text und einer Schaltfläche, wie unten gezeigt.

  1. Sobald Sie auf die Schaltfläche im ersten Fenster klicken, öffnet sich ein neues Nachrichtenfeld mit dem Text, den Sie geschrieben haben.
  2. Sie können jetzt auf die Schaltfläche Details ausblenden/Details anzeigen klicken, um die Sichtbarkeit von zusätzlichem Text umzuschalten.

Wie Sie sehen können, wurde von Python selbst ein Standardtitel bereitgestellt, da wir keinen Fenstertitel im Meldungsfeld festgelegt hatten.

Nun, da es funktioniert, werfen wir einen Blick auf den zusätzlichen Code, den Sie dem vorherigen PyQt5-Beispiel hinzugefügt haben.

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

Dies importiert einige weitere Widgets, die Sie in PyQt5-Beispielen verwendet haben, nämlich QLabel, QPushButton und 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_()

Hier haben Sie eine Methode namens dialog definiert, die ein Meldungsfeld-Widget erstellt und Text für die Schaltflächen und andere Felder eingibt.

Die dialog-Methode wird vom Hauptblock des Programms aufgerufen, wenn eine Schaltfläche in einem bestimmten Widget gedrückt wird (in diesem Fall der btn PushButton). Das auf dieser Schaltfläche ausgelöste Click-Ereignis bewirkt, dass diese Funktion ausgeführt wird. Eine solche Funktion wird in Qt Slot genannt, und Sie werden mehr über Signale erfahren und Slots in den nächsten Absätzen.

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

Dies ist der Hauptabschnitt der App, und wie im vorherigen Beispiel erstellen Sie zunächst eine Instanz von QApplication, gefolgt von einem einfachen Widget, d. h. einer Instanz von QWidget.

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

Sie haben dieser Anwendung zwei neue Widgets hinzugefügt:QLabel und QPushButton. QLabel wird verwendet, um nicht bearbeitbaren Text oder Platzhalter in einem Widget zu drucken, während QPushButton verwendet wird, um eine anklickbare Schaltfläche zu erstellen.

Das Entscheidende, was hier zu beachten ist, ist, dass Sie beim Erstellen der label- und btn-Objekte das window-Objekt (w) an die Konstruktoren von QLabel und QPushButton übergeben. So funktioniert die Verschachtelung in PyQt5. Um ein Widget in einem anderen Widget zu erstellen, übergeben Sie die Referenz des übergeordneten Widgets an den Konstruktor des untergeordneten Widgets.

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

move() wird verwendet, um die Position eines Widgets in Bezug auf sein Eltern-Widget festzulegen. Im ersten Fall wird das Label um 100 Pixel nach links und 130 Pixel nach oben im Fenster verschoben.

Ebenso wird die Schaltfläche 110 Pixel von links und 150 Pixel von oben im Fenster platziert. Dieses Beispiel ist eine grobe Art, Layouts zu erstellen, und wird im Allgemeinen nicht in der Produktion verwendet. es ist hier nur zu Lernzwecken enthalten. Qt unterstützt verschiedene Layouts, die Sie in den nächsten Abschnitten dieses PyQt-Tutorials ausführlich sehen werden.

btn.clicked.connect(dialog)

Schließlich ist dies ein Beispiel für Signale und Slots in Qt. In GUI-basierten Anwendungen werden Funktionen basierend auf den Aktionen des Benutzers ausgeführt, wie z. B. das Bewegen der Maus über ein Element oder das Klicken auf eine Schaltfläche. Diese Aktionen werden als Ereignisse bezeichnet . Denken Sie daran, dass die Methode app.exec_() die Kontrolle an Qt event- übergibt Schleife. Dafür ist die Ereignisschleife da:um auf Ereignisse zu lauschen und als Reaktion darauf Aktionen auszuführen.

Jedes Mal, wenn ein Ereignis eintritt, beispielsweise wenn ein Benutzer auf eine Schaltfläche klickt, löst das entsprechende Qt-Widget ein Signal aus . Diese Signale können mit Python-Funktionen (wie der Dialogfunktion in diesem Beispiel) verbunden werden, sodass die Funktion ausgeführt wird, wenn ein Signal ausgelöst wird. Diese Funktionen werden Slots genannt im Qt-Jargon.

Anschließend lautet die grundlegende Syntax zum Auslösen einer Slot-Funktion als Reaktion auf das Signal eines Ereignisses wie folgt

 widget.signal.connect(slot)

Das heißt, wann immer ein Signal wird durch ein Widget ausgelöst , der verbundene Steckplatz Funktion wird ausgeführt. Zusammenfassend werden Signale und Slots von Qt verwendet, um zwischen Objekten zu kommunizieren und die Wiederverwendbarkeit und Interaktivität von Komponenten zu erleichtern.

Nachdem Sie nun wissen, wie Sie Widgets verschachteln und Interaktionen mithilfe von Signalen und Slots implementieren, finden Sie hier eine Liste nützlicher Widgets und anderer Klassen, die Sie in Ihren PyQt-Apps verwenden können.

Komponenten und Widgets

In PyQt ist eine große Anzahl von Widgets zum Erstellen von GUI-Apps verfügbar. Bei PyQt5 gab es jedoch eine Neuordnung der Klassen in verschiedene Module und Überarbeitungen in den Lizenzen.

Daher ist es wichtig, einen allgemeinen Überblick über die Struktur von PyQt5 zu haben. In diesem Abschnitt erfahren Sie, wie PyQt5 intern organisiert ist, und erfahren mehr über die verschiedenen Module, Bibliotheken und API-Klassen, die von PyQt5 bereitgestellt werden.

PyQt5-Verzeichnisstruktur

Dies sind die grundlegenden Module, die von Pythons Qt-Bindung verwendet werden, insbesondere PyQt5.

PyQt5-Widgets

Hier ist eine Liste der am häufigsten verwendeten Widgets in PyQt5

Layouts und Themen

In den vorherigen PyQt5-Beispielen haben Sie nur die Methoden move() und resize() verwendet, um die Positionen von Widgets in Ihrer GUI festzulegen.

PyQt verfügt jedoch über eine robuste Layout-Management-Engine, mit der erweiterte Benutzeroberflächen für Anwendungen erstellt werden können. In diesem Abschnitt lernen Sie zwei wichtige Klassen kennen, die in Qt zum Erstellen und Verwalten von Layouts verwendet werden.

  1. QBoxLayout
  2. QGridLayout

QBoxLayout

QBoxLayout wird verwendet, um die untergeordneten Widgets des Layouts in einer horizontalen oder vertikalen Reihe auszurichten. Die zwei interessierenden Klassen, die von QBoxLayout erben, sind:

So sehen beispielsweise drei mit QHBoxLayout ausgerichtete Schaltflächen aus.

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

Und so sehen sie in QVBoxLayout aus.

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

Die einzige Funktion, die an dieser Stelle einer Erklärung bedarf, ist die Methode addWidget(). Es wird verwendet, um Widgets in das HBox- oder VBox-Layout einzufügen. Es wird auch in anderen Layouts verwendet, wo es eine andere Anzahl von Parametern benötigt, wie Sie im nächsten Abschnitt sehen werden. Die Widgets werden im Layout in der Reihenfolge angezeigt, in der Sie sie einfügen.

QGridLayout

QGridLayout wird verwendet, um Schnittstellen zu erstellen, in denen die Widgets in Form eines Gitters angeordnet sind (wie eine Matrix oder ein 2D-Array). Um Elemente in ein Rasterlayout einzufügen, können Sie die Matrixdarstellung verwenden, um die Anzahl der Zeilen und Spalten im Raster sowie die Position dieser Elemente zu definieren.

Um beispielsweise ein 3*3-Raster zu erstellen (d. h. ein Raster mit drei Zeilen und drei Spalten), schreiben Sie den folgenden Code:

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

Dies ist die Ausgabe:

Die Methode addWidget() im Grid-Layout akzeptiert diese Argumente:

Zum besseren Verständnis können Sie jedes Widget wie unten gezeigt manuell einfügen

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

So wird das Raster aussehen:

Sie können auch die Parameter rowspan und colspan an addWidget() übergeben, um mehr als eine Zeile oder Spalte zu umfassen.

Zum Beispiel

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

Dadurch wird eine Schaltfläche erstellt, die sich über beide Spalten erstreckt.

Themen

PyQt5 enthält einige integrierte Designs, die Sie in Ihren Apps verwenden können. Der setStyle() -Methode, die von der QApplication-Instanz aufgerufen wird, wird verwendet, um ein bestimmtes Thema für Ihre Anwendung festzulegen.

Wenn Sie beispielsweise die folgende Codezeile hinzufügen, wird das Design Ihrer Anwendung von Standard zu Fusion geändert

app.setStyle("Fusion")

So sieht das vorherige Beispiel im Fusion-Design aus

Eine weitere nützliche Funktion zum Gestalten Ihrer Apps ist die Methode setPalette(). Hier ist der Code zum Ändern der Farbe verschiedener Widgets mit 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_())

Hier ist das Ergebnis.

Um die Methode setPalette() zu verwenden, müssen Sie zunächst eine Palette definieren. Dies geschieht durch Erstellen eines Objekts der QPalette-Klasse.

 qp = QPalette()

Beachten Sie, dass die QPalette-Klasse zum QtGui-Modul gehört und Sie sie importieren müssen, damit dies funktioniert. Nachdem Sie das QPalette-Objekt erstellt haben, verwenden Sie die setColor()-Methode, um den Namen eines Widgets, dessen Farbe Sie ändern möchten, und die einzustellende Farbe zu übergeben.

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

Dadurch ändert sich die Farbe des Fensters in Schwarz. Nachdem Sie Ihr Farbschema definiert haben, verwenden Sie die Funktion setPalette(), um die Palette auf Ihre Anwendung anzuwenden.

app.setPalette(qp)

Das ist alles, was Sie tun müssen, wenn Sie einige grundlegende Themen für Ihre App erstellen möchten. Mit PyQt können Sie auch Stylesheets verwenden, um das Aussehen Ihrer Widgets zu definieren. Wenn Sie mit CSS vertraut sind, können Sie mithilfe von Qt Style Sheets ganz einfach erweiterte Stile für Ihre App definieren.

Zusammenfassung


Python

  1. Tutorial zu C#-Sammlungen mit Beispielen
  2. Python String count() mit BEISPIELE
  3. Python String format() Erklären Sie mit BEISPIELE
  4. Python String find() Methode mit Beispielen
  5. Python-Lambda-Funktionen mit BEISPIELE
  6. Python-Funktion round() mit BEISPIELE
  7. Python map() Funktion mit BEISPIELE
  8. Python Timeit() mit Beispielen
  9. Python-Zähler in Sammlungen mit Beispiel
  10. type() und isinstance() in Python mit Beispielen