Výukový program PyQt5 s příklady: Vytvoření Python GUI s Qt
⚡ Chytré shrnutí
PyQt je Python vazba pro multiplatformní sadu nástrojů Qt widgetů, která umožňuje vývojářům vytvářet nativní grafická uživatelská rozhraní pro stolní počítače. Zabaluje více než šest set C++ třídy zahrnující okna, tlačítka, rozvržení, signály, sloty a témata pro Windows, macOSa Linux.

Následující sekce vás provedou od základů PyQt přes instalaci, základní widgety, rozvržení a šablony s příklady, které lze spustit.
Co je PyQt?
PyQt je Python vazba open-source widget-toolkitu Qt, který funguje také jako framework pro vývoj multiplatformních aplikací. Qt je populární C++ framework pro psaní grafických aplikací pro všechny hlavní desktopové, mobilní a embedded platformy (podporuje Linux, Windows, macOS, Android, iOS, Raspberry Pi a další).
PyQt je svobodný software vyvinutý a spravovaný společností Riverbank Computing se sídlem v Anglii, zatímco Qt je vyvíjen finskou firmou s názvem The Qt Company.
Vlastnosti PyQt
Zde jsou důležité funkce PyQt:
PyQt se skládá z více než šesti set tříd pokrývajících řadu funkcí, jako například:
- Grafická uživatelská rozhraní
- Databáze SQL
- Webové sady nástrojů
- XML zpracování
- networking
Tyto funkce lze kombinovat a vytvářet tak pokročilá uživatelská rozhraní i samostatné aplikace. Qt používá mnoho velkých společností napříč všemi odvětvími. Mezi příklady patří LG, Mercedes, AMD, Panasonic a Harman.
Verze PyQt
PyQt je k dispozici ve dvou edicích, PyQt4 a PyQt5. PyQt4 poskytuje spojovací kód pro vazbu verzí frameworku Qt 4.x a 5.x, zatímco PyQt5 poskytuje vazbu pouze pro verze 5.x. V důsledku toho není PyQt5 zpětně kompatibilní se zastaralými moduly starší verze. V tomto tutoriálu s grafickým rozhraním PyQt bude PyQt5 použit pro demonstraci příkladů. Kromě těchto dvou verzí poskytuje Riverbank Computing také PyQt3D – Python vazby pro framework Qt3D. Qt3D je aplikační framework používaný k vytváření simulačních systémů v reálném čase s 2D/3D vykreslováním.
Jak nainstalovat PyQt5
V tomto tutoriálu PyQt5 uvidíme dva způsoby instalace PyQt:
- Použití souborů Wheel
- Sestavení a instalace ze zdroje
Qt (vyslovováno roztomilý) je komplexní systém a kódová základna PyQt obsahuje kompilovaný C++ a Python kód pod kapotou. V důsledku toho je jeho sestavení a instalace ze zdrojového kódu složitější než u jiných Python knihovny. PyQt5 však můžete snadno nainstalovat pomocí koleček.
Instalace s kolečky
Kola jsou novým standardem Python formát balení a distribuce. Jednoduše řečeno, kolečko je ZIP archiv se speciálním názvem a .whl přípona souboru. Kola lze instalovat pomocí pip (Pythonsprávce balíčků), který je standardně součástí nejnovějších verzí Python.
Pokud tedy máte Python 3.4 nebo novější, již máte pip. Pokud však používáte starší verzi Python, před dalším postupem si musíte stáhnout a nainstalovat pip. Pokyny můžete vyhledat na tomto odkazu: https://pypi.org/project/pip/.
Instalace PyQt5:
Krok 1) Otevřete příkazový řádek.
Otevřete příkazový řádek nebo PowerShell ve svém Windows stroj.
Krok 2) Zadejte následující.
pip install PyQt5
Krok 3) Instalace úspěšná.
Tento krok v tomto tutoriálu PyQt5 stáhne balíček PyQt5 whl (asi 50 MB) a nainstaluje jej do vašeho systému.
Případně si také můžete stáhnout a Windows binární soubor pro verzi Python v počítači.
Po dokončení přejděte k další části tohoto tutoriálu PyQt5 a napište svou první aplikaci GUI.
Základní PyQt Concepts a Programy
Nyní, když jste si úspěšně nainstalovali PyQt5 na svůj počítač, jste připraveni psát. Python Aplikace s grafickým rozhraním.
Začněme v tomto tutoriálu o PyQt5 s jednoduchou aplikací, která na obrazovce zobrazí prázdné okno.
Rozpalte svůj Python IDLE a zadejte následující:
Program 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_())
Uložte jej jako app.py (název nehraje roli) a stisknutím klávesy F5 spusťte program. Případně stačí dvakrát kliknout na uložený soubor a spustit aplikaci. Pokud jste vše udělali správně, otevře se nové okno s názvem Guru99, jak je uvedeno níže.
Skvělé! Funguje to. Není to moc, ale stačí to k pochopení základů. Nyní se v tomto tutoriálu o PyQt podrobně podívejme, co dělá každý řádek ve vašem programu.
from PyQt5.QtWidgets import QApplication, QWidget
Tento příkaz importuje všechny moduly, které potřebujete k vytvoření GUI, do aktuálního jmenného prostoru. Modul QtWidgets obsahuje všechny hlavní widgety, které v tomto budete používat Python Qt tutoriál.
app = QApplication(sys.argv)
Zde vytváříte objekt třídy QApplication. Tento krok je pro PyQt5 nutností; každá aplikace uživatelského rozhraní musí vytvořit instanci QApplication jako jakýsi vstupní bod do aplikace. Pokud jej nevytvoříte, zobrazí se chyby.
sys.argv je seznam parametrů příkazového řádku, které můžete předat aplikaci při jejím spouštění přes shell nebo při automatizaci rozhraní.
V tomto příkladu PyQt5 jste QApplication nepředali žádné argumenty. Můžete jej tedy nahradit níže uvedeným kódem a ani nemusíte importovat modul sys.
app = QApplication([])
w = QWidget()
Dále vytvoříme objekt třídy QWidget. QWidget je základní třída všech objektů uživatelského rozhraní v Qt a prakticky vše, co vidíte v aplikaci, je widget. To zahrnuje dialogy, texty, tlačítka, pruhy a tak dále. Funkce, která vám umožňuje navrhovat složitá uživatelská rozhraní, spočívá v tom, že widgety lze vnořovat, tj. můžete mít widget uvnitř widgetu, který je uvnitř dalšího widgetu. To uvidíte v akci v další části.
w.resize(300,300)
Metoda změny velikosti třídy QWidget umožňuje nastavit rozměry libovolného widgetu. V tomto případě jste změnili velikost okna na 300 x 300 pixelů.
Zde byste si měli uvědomit, že widgety mohou být vnořené dohromady; nejvzdálenější widget (tj. widget bez rodiče) se nazývá Okno.
w.setWindowTitle("Guru99")
Metoda setWindowTitle() umožňuje předat řetězec jako argument, který nastaví název okna na předaný řetězec. V příkladu PyQt5 se zobrazí záhlaví okna. Guru99.
w.show()
show() jednoduše zobrazí widget na obrazovce monitoru.
sys.exit(app.exec_())
Metoda app.exec_() spustí Qt/C++ smyčka událostí. Jak víte, PyQt je z velké části napsán v C++ a používá mechanismus smyčky událostí k implementaci paralelního provádění. app.exec_() předá řízení Qt, který ukončí aplikaci pouze tehdy, když ji uživatel zavře z grafického rozhraní. Proto ctrl+c neukončí aplikaci jako v jiných Python programy. Protože Qt má nad aplikací kontrolu, Python události se nezpracovávají, pokud je nenastavíme uvnitř aplikace. Všimněte si také, že metoda exec má ve svém názvu podtržítko; je to proto, že exec() již bylo klíčovým slovem v Python a podtržítko řeší konflikt pojmenování.
Za prázdnými okny
V předchozí části jste si ukázali, jak v Qt vytvořit základní widget. Nyní je čas vytvořit složitější rozhraní, se kterými mohou uživatelé skutečně interagovat. Znovu spusťte IDLE a napište následující.
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_())
Uložte soubor jako appone.py nebo jakkoli chcete a stisknutím klávesy F5 spusťte program. Pokud jste neudělali žádné chyby, IDLE otevře nové okno s nějakým textem a tlačítkem, jak je uvedeno níže.
- Jakmile kliknete na tlačítko v prvním okně, otevře se nové okno se zprávou s textem, který jste napsali.
- Nyní můžete kliknout na tlačítko Skrýt podrobnosti/Zobrazit podrobnosti a přepnout viditelnost dalšího textu.
Jak vidíte, jelikož jsme v okně se zprávou nenastavili žádný název okna, byl zadán výchozí název pomocí Python sám.
Nyní, když to funguje, se podívejme na dodatečný kód, který jste přidali do předchozího příkladu PyQt5.
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox
Toto importuje některé další widgety, které jste použili v příkladech PyQt5, jmenovitě QLabel, QPushButton a 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_()
Zde jste definovali metodu nazvanou dialog, která vytvoří widget schránky zpráv a nastaví nějaký text do tlačítek a dalších polí.
Dialogová metoda je volána z hlavního bloku programu, když je stisknuto tlačítko v určitém widgetu (v tomto případě btn PushButton). Událost kliknutí spuštěná na tomto tlačítku způsobí provedení této funkce. Taková funkce se v Qt nazývá slot a dozvíte se o ní více signály a sloty v následujících odstavcích.
if __name__ == "__main__": app = QApplication(sys.argv) w = QWidget() w.resize(300,300) w.setWindowTitle("Guru99")
Toto je hlavní část aplikace a stejně jako v předchozím příkladu začínáte vytvořením instance QApplication, po níž následuje jednoduchý widget, tj. instance QWidget.
label = QLabel(w)
btn = QPushButton(w)
Do této aplikace jste přidali dva nové widgety: QLabel a QPushButton. QLabel se používá k tisku neupravitelného textu nebo zástupných symbolů uvnitř widgetu, zatímco QPushButton se používá k vytvoření tlačítka, na které lze kliknout.
Kritická věc, kterou si zde musíte všimnout, je, že když vytváříte objekty label a btn, předáváte objekt okna (w) konstruktorům QLabel a QPushButton. Takto funguje vnořování v PyQt5. Chcete-li vytvořit widget v jiném widgetu, předáte odkaz na rodičovský widget konstruktoru potomka.
label.move(100,130) btn.move(110,150)
move() se používá k nastavení pozice widgetu vzhledem k jeho rodičovskému widgetu. V prvním případě se štítek přesune o 100 pixelů zleva a 130 pixelů z horní části okna.
Podobně bude tlačítko umístěno 110px zleva a 150px z horní části okna. Tento příklad je hrubý způsob, jak dosáhnout rozložení a obecně se nepoužívá ve výrobě; je zde zahrnut pouze pro účely učení. Qt podporuje různá rozložení, která podrobně uvidíte v nadcházejících částech tohoto tutoriálu PyQt.
btn.clicked.connect(dialog)
Nakonec je zde příklad signálů a slotů v Qt. V aplikacích s grafickým uživatelským rozhraním se funkce provádějí na základě akcí provedených uživatelem, jako je najetí myší na prvek nebo kliknutí na tlačítko. Tyto akce se nazývají akce. Připomeňme, že metoda app.exec_() přenáší řízení na Qt událost smyčka. K tomu slouží smyčka událostí: naslouchání událostem a provádění akcí v reakci.
Kdykoli dojde k události, jako když uživatel klikne na tlačítko, odpovídající widget Qt vyvolá a signál. Tyto signály lze připojit Python funkce (jako dialogová funkce v tomto příkladu), takže funkce se provede, když je spuštěn signál. Tyto funkce se nazývají sloty v Qt žargonu.
Základní syntaxe pro spuštění slotové funkce v reakci na signál z události je následně následující:
widget.signal.connect(slot)
To znamená, že kdykoli signál je spuštěna a Widget, připojený štěrbina funkce bude provedena. Stručně řečeno, signály a sloty používá Qt ke komunikaci mezi objekty a usnadňuje opětovné použití komponent a interaktivitu.
Nyní, když víte, jak vnořovat widgety a implementovat interakce pomocí signálů a slotů, zde je seznam užitečných widgetů a dalších tříd, které můžete použít ve svých aplikacích PyQt.
Komponenty a widgety
V PyQt je k dispozici velké množství widgetů pro vytváření GUI aplikací. S PyQt5 však došlo k přeskupení tříd do různých modulů a revizí v licencích.
Proto je zásadní mít obecný přehled o struktuře PyQt5. V této části uvidíte, jak je PyQt5 interně organizován, a dozvíte se o různých modulech, knihovnách a třídách API, které PyQt5 poskytuje.
Adresářová struktura PyQt5
Toto jsou základní moduly, které používá Python's Qt binding, konkrétně PyQt5.
- QtKombinuje všechny níže uvedené třídy/moduly do jednoho modulu. Výrazně zvyšuje paměť využívanou aplikací. Správa frameworku je však snazší importem pouze jednoho modulu.
- QtCore: Obsahuje základní negrafické třídy používané jinými moduly. Zde je implementována smyčka událostí Qt, signály a slotová konektivita atd.
- QtWidgetsObsahuje většinu widgetů dostupných v PyQt5.
- QtGui: Obsahuje komponenty GUI a rozšiřuje modul QtCore.
- QtNetwork: Obsahuje třídy používané k implementaci síťového programování prostřednictvím Qt. Podporuje servery TCP, sokety TCP, sokety UDP, zpracování SSL, síťové relace a vyhledávání DNS.
- QtMultimedia: poskytuje multimediální funkce nízké úrovně.
- QtSql: implementuje integraci databáze pro databáze SQL. Podporuje ODBC, MySQL, Oracle, SQLite, a PostgreSQL.
Widgety PyQt5
Zde je seznam nejčastěji používaných widgetů v PyQt5:
- QLineEdit: Toto je vstupní pole, které umožňuje uživateli zadat jeden řádek textu.
line = QLineEdit()
- QRadioButtonToto je vstupní pole s tlačítkem, které lze vybrat, podobné přepínačům v HTML.
rad = QRadioButton("button title") rad.setChecked(True) #to select the button by default.
- QComboBox: Používá se k zobrazení rozbalovací nabídky se seznamem volitelných položek.
drop = QComboBox(w) drop.addItems(["item one", "item two", "item three"])
- QCheckBox: Zobrazí volitelný čtvercový rámeček před štítkem, který je zaškrtnutý, pokud je vybrán, podobně jako přepínače.
check = QCheckBox("button title")
- QMenuBarZobrazuje vodorovný panel nabídek v horní části okna. Do tohoto panelu můžete přidávat pouze objekty třídy QMenu. Tyto objekty QMenu mohou dále obsahovat řetězce, objekty QAction nebo jiné objekty QMenu.
- QToolBar: Je to vodorovný pruh nebo panel, který lze v okně přesouvat. Může obsahovat tlačítka a další widgety.
- QTab: Slouží k rozdělení obsahu okna na více stránek, ke kterým lze přistupovat prostřednictvím různých záložek v horní části widgetu. Skládá se ze dvou částí: panelu záložek a stránky záložek.
- QScrollBarPoužívá se k vytvoření posuvníků, které umožňují uživateli posouvat se nahoru a dolů v okně. Skládá se z pohyblivého posuvníku, posuvníku track a dvě tlačítka pro posouvání posuvníku nahoru nebo dolů.
scroll = QScrollBar()
- QSplitter: Rozdělovače se používají k oddělení obsahu okna, aby byly widgety správně seskupeny a nepůsobily přeplněně. QSplitter je jedním z primárních ovladačů rozvržení dostupných v PyQt5 a používá se k horizontálnímu i vertikálnímu rozdělení obsahu.
- QDockDokovací widget je podokno se dvěma vlastnostmi: lze jej přesouvat v rámci hlavního okna a lze jej ukotvit mimo nadřazené okno na jiné místo na obrazovce.
Rozvržení a motivy
V předchozích příkladech PyQt5 jste k nastavení pozic widgetů ve vašem GUI používali pouze metody move() a resize().
PyQt má však robustní modul pro správu rozložení, který lze použít k vytvoření pokročilých uživatelských rozhraní pro aplikace. V této části se dozvíte o dvou důležitých třídách, které se v Qt používají k vytváření a správě rozvržení.
- QBoxNákres
- QGridLayout
QBoxNákres
QBoxRozvržení se používá k zarovnání podřízených widgetů rozvržení do vodorovného nebo svislého řádku. Dvě zájmové třídy, které dědí od QBoxRozložení jsou:
- QHBoxRozvržení: používá se k horizontálnímu lemování podřízených widgetů.
- QVBoxRozvržení: používá se k vertikálnímu zarovnání podřízených widgetů.
Například takto jsou tři tlačítka zarovnána s QHBoxRozložení bude vypadat.
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_())
A takhle budou vypadat v QVBoxRozvržení.
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_())
Jedinou funkcí, která v tomto okamžiku potřebuje nějaké vysvětlení, je metoda addWidget(). Slouží k vkládání widgetů do HBox nebo VBox rozložení. Používá se také v jiných rozloženích, kde vyžaduje jiný počet parametrů, jak uvidíte v další části. Widgety se zobrazí uvnitř rozvržení v pořadí, v jakém je vložíte.
QGridLayout
QGridLayout se používá k vytváření rozhraní, ve kterých jsou widgety uspořádány ve formě mřížky (jako matice nebo 2D pole). Chcete-li vložit prvky do rozvržení mřížky, můžete pomocí maticové reprezentace definovat počet řádků a sloupců v mřížce a také polohu těchto prvků.
Chcete-li například vytvořit mřížku 3*3 (tj. mřížku se třemi řádky a třemi sloupci), napíšete následující kód:
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_())
Toto bude výstup:
Metoda addWidget() v rozvržení mřížky přijímá tyto argumenty:
- Objekt widgetu, který chcete přidat do mřížky
- X-ová souřadnice objektu
- Y-ová souřadnice objektu
- Rozpětí řádků (výchozí = 0)
- Rozsah sloupců (výchozí = 0)
Pro lepší pochopení můžete každý widget vložit ručně, jak je znázorněno níže.
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_())
Takto bude mřížka vypadat:
Parametry rowspan a colspan můžete také předat metodě addWidget() a pokrýt tak více než jeden řádek nebo sloupec.
Například,
grid.addWidget(QPushButton("Button five"),2,0,1,0)
Vznikne tak tlačítko, které se natáhne přes oba sloupce.
Témata
PyQt5 přichází s některými vestavěnými motivy, které můžete použít ve svých aplikacích. The setStyle() metoda volaná na instanci QApplication se používá k nastavení konkrétního motivu pro vaši aplikaci.
Například přidáním následujícího řádku kódu se změní téma vaší aplikace z výchozího na Fusion.
app.setStyle("Fusion")
Takto bude vypadat předchozí příklad v šabloně Fusion.
Další užitečnou funkcí pro úpravu témat vašich aplikací je metoda setPalette(). Zde je kód pro změnu barvy různých widgetů pomocí 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_())
Zde je výsledek.
Chcete-li použít metodu setPalette(), musíte nejprve definovat paletu. To se provádí vytvořením objektu třídy QPalette.
qp = QPalette()
Všimněte si, že třída QPalette patří do modulu QtGui a pro její fungování ji budete muset importovat. Jakmile vytvoříte objekt QPalette, použijte metodu setColor() k předání názvu widgetu, jehož barvu chcete změnit, a barvy, kterou chcete nastavit.
qp.setColor(QPalette.Window, Qt.black)
Tím se změní barva okna na černou. Po definování barevného schématu použijte funkci setPalette() k aplikaci palety ve vaší aplikaci.
app.setPalette(qp)
To je vše, co musíte udělat, pokud chcete pro svou aplikaci vytvořit základní motivy. PyQt vám také umožňuje používat šablony stylů k definování vzhledu vašich widgetů. Pokud jste obeznámeni s CSS, můžete snadno definovat pokročilé styly pro svou aplikaci pomocí Qt Style Sheets.












