Python PyQt
PyQt ist eine leistungsstarke Python-Bibliothek zur Erstellung grafischer Benutzeroberflächen (GUIs), die verwendet werden kann, um das in Python integrierte Tkinter zu ersetzen.
PyQt ist die Python-Anbindung für das Qt-Framework, das in der Entwicklung von Desktop-Anwendungen weit verbreitet ist.
Qt ist ein plattformübergreifendes Framework für die Entwicklung von C++-Anwendungen.
PyQt ermöglicht Python-Entwicklern, die Qt-Bibliothek zu nutzen, um leistungsstarke GUI-Anwendungen zu erstellen.
PyQt hat die folgenden Hauptversionen:
- PyQt4: Bindungen basierend auf Qt4
- PyQt5: Bindungen basierend auf Qt5
- PyQt6: Bindungen basierend auf Qt6 (neueste Version)
PyQt installieren
PyQt5 mit pip installieren:
# 安装PyQt5 pip install PyQt5 # 安装Qt设计师和其他工具(可选) pip install PyQt5-tools
Erstes PyQt-Programm
Ein einfaches Fenster erstellen
Das Folgende ist ein einfaches PyQt-Programm, das ein leeres Fenster erstellt:
Beispiel
# Anwendungsinstanz erstellen
app = QApplication([])
# Hauptfenster erstellen
window = QWidget()
window.setWindowTitle("Mein erstes PyQt-Programm")
window.setGeometry(100, 100, 400, 300) # (x, y, Breite, Höhe)
# Fenster anzeigen
window.show()
# Anwendung ausführen
app.exec_()

Code-Erklärung
QApplicationVerwaltet den Kontrollfluss und die Haupteinstellungen von GUI-Anwendungen.QWidgetDie grundlegendste Fensterklasse, alle UI-Komponenten erben von ihr.setWindowTitle()Legt den Fenstertitel fest.setGeometry()Legt die Fensterposition und -größe fest.show()Zeigt das Fenster an.app.exec_()Startet die Ereignisschleife und wartet auf Benutzerinteraktion.
Eine typische PyQt-Anwendung besteht aus den folgenden Teilen:
- QApplication-ObjektJede PyQt-Anwendung benötigt eine QApplication-Instanz.
- Fenster und WidgetsKomponenten der Benutzeroberfläche.
- EreignisschleifeEine Schleife, die Benutzereingaben und Systemereignisse verarbeitet.
- EreignisbehandlungsroutinenFunktionen oder Methoden, die auf Ereignisse reagieren.
Beispiel
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# Fenstertitel und Größe festlegen
self.setWindowTitle("Meine erste PyQt-Anwendung")
self.setGeometry(100, 100, 400, 300) # x, y, Breite, Höhe
# Button erstellen
self.button = QPushButton("Klick mich", self)
self.button.setGeometry(150, 150, 100, 30)
self.button.clicked.connect(self.button_clicked)
def button_clicked(self):
print("Button wurde geklickt!")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

Häufige PyQt-Widgets
Schaltfläche (QPushButton)
Beispiel
button = QPushButton("Klick mich", window)
button.move(150, 150) # Button-Position setzen
Beschriftung (QLabel)
Beispiel
label = QLabel("Hallo PyQt!", window)
label.move(100, 100)
Textfeld (QLineEdit)
Beispiel
textbox = QLineEdit(window)
textbox.move(100, 50)
Weitere gängige Widgets finden Sie unter:https://www.example.com/python3/python-pyqt-widgets.html
Layout-Verwaltung (QVBoxLayout)
Durch die Verwendung von Layout-Managern können Widget-Positionen automatisch angepasst werden:
Beispiel
layout = QVBoxLayout()
layout.addWidget(QLabel("Benutzername"))
layout.addWidget(QLineEdit())
layout.addWidget(QPushButton("Anmelden"))
window.setLayout(layout)
Weitere Inhalte zur Layoutverwaltung finden Sie unter:https://www.example.com/python3/python-pyqt-layout.html
Signal- und Slot-Mechanismus
PyQt verwendet denSignalundSlot-Mechanismus zur Behandlung von Ereignissen.
Der Signal- und Slot-Mechanismus von PyQt ist der Kernmechanismus für die Kommunikation zwischen Objekten.
- Signal: Eine Benachrichtigung, die bei Eintreten eines bestimmten Ereignisses gesendet wird.
- Slot: Eine Funktion oder Methode, die auf Signale reagiert.
Beispiel
def on_button_click():
print("Button wurde geklickt!")
button = QPushButton("Klick mich", window)
button.clicked.connect(on_button_click) # Signal und Slot verbinden
Benutzerdefinierte Signale
Beispiel
class MyEmitter(QObject):
my_signal = pyqtSignal(str) # Signal definieren
emitter = MyEmitter()
emitter.my_signal.connect(lambda x: print(f"Signal empfangen: {x}"))
emitter.my_signal.emit("Hello") # Signal aussenden
Weitere Inhalte zur Layoutverwaltung finden Sie unter:https://www.example.com/python3/python-pyqt-signals-and-slots.html
Qt Designer verwenden
Qt Designer ist ein visuelles Designwerkzeug, mit dem Sie Widgets per Drag-and-Drop ziehen und ablegen können, um Oberflächen zu entwerfen:
- Starten Sie Designer (normalerweise im Verzeichnis Lib\site-packages\qt5_applications\Qt\bin Ihrer Python-Installation)
- Entwerfen Sie die Oberfläche und speichern Sie sie als.uiDatei
wird die.uiDatei in Python-Code umwandeln:
pyuic5 input.ui -o output.py
Verwende die generierte Oberfläche im Code:
Beispiel
# UI-Datei laden
Form, Window = uic.loadUiType("output.ui")
# UI verwenden
app = QApplication(sys.argv)
window = Window()
form = Form()
form.setupUi(window)
window.show()
sys.exit(app.exec_())
Praktische Übung: Einfache Notizblock-Anwendung
Oberflächendesign
Beispiel
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTextEdit,
QAction, QFileDialog, QMessageBox)
class Notepad(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.text_edit = QTextEdit(self)
self.setCentralWidget(self.text_edit)
self.create_actions()
self.create_menus()
self.setWindowTitle('Einfacher Editor')
self.setGeometry(100, 100, 800, 600)
def create_actions(self):
# Dateimenü-Aktionen
self.new_action = QAction('Neu', self)
self.new_action.setShortcut('Ctrl+N')
self.new_action.triggered.connect(self.new_file)
self.open_action = QAction('Öffnen', self)
self.open_action.setShortcut('Ctrl+O')
self.open_action.triggered.connect(self.open_file)
self.save_action = QAction('Speichern', self)
self.save_action.setShortcut('Ctrl+S')
self.save_action.triggered.connect(self.save_file)
self.exit_action = QAction('Beenden', self)
self.exit_action.setShortcut('Ctrl+Q')
self.exit_action.triggered.connect(self.close)
# Aktionen des Bearbeiten-Menüs
self.copy_action = QAction('Kopieren', self)
self.copy_action.setShortcut('Ctrl+C')
self.copy_action.triggered.connect(self.text_edit.copy)
self.paste_action = QAction('Einfügen', self)
self.paste_action.setShortcut('Ctrl+V')
self.paste_action.triggered.connect(self.text_edit.paste)
self.cut_action = QAction('Ausschneiden', self)
self.cut_action.setShortcut('Ctrl+X')
self.cut_action.triggered.connect(self.text_edit.cut)
def create_menus(self):
menubar = self.menuBar()
# Datei-Menü
file_menu = menubar.addMenu('Datei')
file_menu.addAction(self.new_action)
file_menu.addAction(self.open_action)
file_menu.addAction(self.save_action)
file_menu.addSeparator()
file_menu.addAction(self.exit_action)
# Bearbeiten-Menü
edit_menu = menubar.addMenu('Bearbeiten')
edit_menu.addAction(self.copy_action)
edit_menu.addAction(self.paste_action)
edit_menu.addAction(self.cut_action)
def new_file(self):
self.text_edit.clear()
def open_file(self):
filename, _ = QFileDialog.getOpenFileName(self, 'Datei öffnen')
if filename:
try:
with open(filename, 'r') as f:
self.text_edit.setText(f.read())
except Exception as e:
QMessageBox.warning(self, 'Fehler', f'Datei kann nicht geöffnet werden: {e}')
def save_file(self):
filename, _ = QFileDialog.getSaveFileName(self, 'Datei speichern')
if filename:
try:
with open(filename, 'w') as f:
f.write(self.text_edit.toPlainText())
except Exception as e:
QMessageBox.warning(self, 'Fehler', f'Datei kann nicht gespeichert werden: {e}')
if __name__ == '__main__':
app = QApplication(sys.argv)
notepad = Notepad()
notepad.show()
sys.exit(app.exec_())

PyQt5-Kern-Widgets
Die meisten Widgets befinden sich in PyQt5.QtWidgets.
Erweiterte Funktionen (wie Multimedia, Netzwerk) erfordern möglicherweise andere Module (z. B. QtCore, QtGui, QtNetwork usw.).
QListView/QTableView/QTreeView müssen zusammen mit einem Datenmodell (wie QStandardItemModel) verwendet werden, um größere Flexibilität zu erreichen.
Weitere Installationserweiterungen:
pip install PyQtWebEngine # 网页支持 pip install PyQtChart # 图表支持
| Widget-Kategorie | Widget-Name | Modul | Beschreibung |
|---|---|---|---|
| Grundlegende Fenster-Widgets | QWidget | QtWidgets | Basisklasse für alle Benutzeroberflächenobjekte, kann als leeres Fenster oder Container verwendet werden. |
QMainWindow | QtWidgets | Hauptfenster-Framework, enthält Menüleiste, Symbolleiste, Statusleiste usw. | |
QDialog | QtWidgets | Basisklasse für Dialoge, wird für Pop-up-Fenster verwendet. | |
| Layout-Verwaltung | QVBoxLayout | QtWidgets | Vertikaler Layout-Manager |
QHBoxLayout | QtWidgets | Horizontaler Layout-Manager | |
QGridLayout | QtWidgets | Grid-Layout-Manager | |
QFormLayout | QtWidgets | Formular-Layout-Manager (Label- + Eingabefeld-Paare) | |
| Button-Klassen | QPushButton | QtWidgets | Normaler Button |
QRadioButton | QtWidgets | Radiobutton | |
QCheckBox | QtWidgets | Kontrollkästchen | |
QToolButton | QtWidgets | Toolbar-Button (kann Symbol haben) | |
| Eingabe-Widgets | QLineEdit | QtWidgets | Einzeiliges Texteingabefeld |
QTextEdit | QtWidgets | Mehrzeiliger Rich-Text-Editor (unterstützt HTML) | |
QPlainTextEdit | QtWidgets | Mehrzeiliger Klartext-Editor | |
QSpinBox | QtWidgets | Spinbox (Ganzzahl) | |
QDoubleSpinBox | QtWidgets | Spinbox (Gleitkommazahl) | |
QComboBox | QtWidgets | Dropdown-Auswahlfeld | |
QDateEdit | QtWidgets | Datumsauswahlfeld | |
QTimeEdit | QtWidgets | Zeitauswahlfeld | |
QDateTimeEdit | QtWidgets | Datum-Uhrzeit-Auswahlfeld | |
QSlider | QtWidgets | Schieberegler (horizontal/vertikal) | |
QDial | QtWidgets | Drehknopf-Steuerelement | |
| Anzeige-Widgets | QLabel | QtWidgets | Text-/Bild-Label |
QLCDNumber | QtWidgets | LCD-Digitalanzeige | |
QProgressBar | QtWidgets | Fortschrittsbalken | |
QStatusBar | QtWidgets | Statusleiste (normalerweise verwendet fürQMainWindow) | |
| Container-Klassen | QGroupBox | QtWidgets | Gruppenfeld (Container mit Titel) |
QTabWidget | QtWidgets | Tab-Container | |
QStackedWidget | QtWidgets | Gestapelter Container (zeigt jeweils ein untergeordnetes Widget an) | |
QScrollArea | QtWidgets | Scrollbereich-Container | |
QMdiArea | QtWidgets | MDI-Bereich (Multiple Document Interface) | |
| Liste/Tabelle/Baum | QListWidget | QtWidgets | Listensteuerelement (mit Elementverwaltung) |
QTreeWidget | QtWidgets | Baum-Widget | |
QTableWidget | QtWidgets | Tabellen-Widget | |
QListView | QtWidgets | Listenansicht (erfordert ein Datenmodell) | |
QTableView | QtWidgets | Tabellenansicht (erfordert ein Datenmodell) | |
QTreeView | QtWidgets | Baumansicht (erfordert ein Datenmodell) | |
| Menü/Symbolleiste | QMenuBar | QtWidgets | Menüleiste |
QMenu | QtWidgets | Menü (kann Untermenüs und Aktionen enthalten) | |
QToolBar | QtWidgets | Symbolleiste | |
QAction | QtWidgets | Aktion (wird für Menüeinträge, Symbolleisten-Schaltflächen usw. verwendet) | |
| Dialog | QFileDialog | QtWidgets | Dateiauswahldialog |
QColorDialog | QtWidgets | Farbauswahldialog | |
QFontDialog | QtWidgets | Schriftauswahldialog | |
QInputDialog | QtWidgets | Eingabedialog (Text, Zahlen usw.) | |
QMessageBox | QtWidgets | Meldungsdialog (Warnung, Fehler, Frage usw.) | |
| Grafikansicht | QGraphicsView | QtWidgets | Graphics View Framework (für 2D-Grafiken) |
QGraphicsScene | QtWidgets | Grafikszene (für kombinierteQGraphicsViewVerwendung) | |
| Weitere funktionale Komponenten | QCalendarWidget | QtWidgets | Kalender-Widget |
QSplashScreen | QtWidgets | Splash-Screen | |
QSystemTrayIcon | QtWidgets | System-Tray-Symbol | |
QWebEngineView | QtWebEngineWidgets | Webbrowser-Komponente (erfordert separate InstallationPyQtWebEngine) |