Výukový program PyQt5 s příklady: Návrh GUI pomocí PyQt in Python
Co je PyQt?
PyQt je pythonová vazba open-source widget-toolkit Qt, který také funguje jako rámec pro vývoj aplikací pro různé platformy. Qt je populární C++ framework pro psaní GUI aplikací pro všechny hlavní desktopové, mobilní a embedded platformy (podporuje Linux, Windows, Operační Systém Mac, 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 The Qt Company.
Vlastnosti PyQT
Zde jsou důležité funkce PyQt:
Naučte se PyQt, který se skládá z více než šesti set tříd pokrývajících řadu funkcí, jako je např
- Grafická uživatelská rozhraní
- Databáze SQL
- Webové sady nástrojů
- XML zpracování
- networking
Tyto funkce lze kombinovat a vytvářet pokročilé uživatelské rozhraní i samostatné aplikace. Mnoho velkých společností ve všech odvětvích používá Qt. Některé příklady jsou LG, Mercedes, AMD, Panasonic, Harman atd.
Verze PyQt
PyQt je k dispozici ve dvou edicích, PyQt4 a PyQt5. PyQt4 poskytuje připojovací kód pro vazbu verzí 4.xa 5.x rámce Qt, zatímco PyQt5 poskytuje vazbu pouze pro verze 5.x. Výsledkem je, že PyQt5 není zpětně kompatibilní se zastaralými moduly starší verze. V tomto tutoriálu Qt GUI bude PyQt5 použit pro demonstraci příkladů. Kromě těchto dvou verzí,
Riverbank Computing také poskytuje PyQt3D – vazby pythonu pro rámec Qt3D. Qt3D je aplikační rámec 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++ si Python kód pod kapotou. V důsledku toho je ve srovnání s jinými pythonovými knihovnami komplikovaný proces jeho sestavení a instalace ze zdroje. 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, musíte si stáhnout a nainstalovat pip, než budete pokračovat. Návod k tomu můžete vyhledat na tomto odkazu: https://pypi.org/project/pip/.
Chcete-li nainstalovat 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í pro verzi pythonu nainstalovanou na vašem 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 úspěšně nainstalovali PyQt5 do vašeho počítače, jste připraveni psát Python Aplikace pro návrh GUI.
Začněme jednoduchou aplikací v tomto tutoriálu PyQt5, která na vaší obrazovce zobrazí prázdné okno.
Zapalte svého pythona 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 (na názvu nezáleží) a stisknutím klávesy F5 spusťte program. Případně stačí dvakrát kliknout na uložený soubor a spustit aplikaci. Pokud jste udělali vše správně, otevře se nové okno s názvem Guru99, jak je znázorněno níže.
Skvělý! Funguje to. Není to mnoho, ale na pochopení základů to stačí. Nyní v tomto tutoriálu PyQt podrobně uvidíme, co každý z řádků ve vašem programu dělá.
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 QApplications nepředali žádné argumenty. Proto jej můžete také nahradit níže uvedeným kódem a nemusíte ani 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 měli pamatovat na to, že widgety mohou být vnořené dohromady, nejvzdálenější widget (tj. widget bez rodiče) se nazývá Window.
w.setWindowTitle("Guru99")
Metoda setWindowTitle() vám umožňuje předat řetězec jako argument, který nastaví název okna na řetězec, který předáte. V příkladu PyQt5 se v záhlaví zobrazí 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á kontrolu Qt, která ukončí aplikaci pouze tehdy, když ji uživatel zavře z GUI. To je důvod, proč ctrl+c neukončí aplikaci jako v jiných pythonových programech. Protože Qt má kontrolu nad aplikací, události pythonu se nezpracovávají, pokud je nenastavíme v aplikaci. 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é slovo v pythonu a podtržítko řeší konflikt pojmenování.
Za prázdnými okny
V předchozí části jste viděli, jak vytvořit základní widget v Qt. Nyní je čas vytvořit další zapojená rozhraní, se kterými mohou uživatelé skutečně komunikovat. Znovu, zapalte svůj 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 cokoliv jiného a stiskněte F5 pro spuštění programu. Pokud jste neudělali žádnou chybu, 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 můžete vidět, protože jsme nenastavili žádný název okna v okně zprávy, výchozí název poskytl samotný python.
Nyní, když to funguje, pojďme se podívat na extra 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 si 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í sekce aplikace a stejně jako v předchozím příkladu začnete vytvořením instance QApplication následovanou jednoduchým widgetem, tj. instancí 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)
Konečně, toto je příklad signálů a slotů v Qt. V aplikacích založených na grafickém uživatelském rozhraní jsou funkce prováděny na základě akcí prováděný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 funkce pythonu (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.
Následně je základní syntaxe pro spuštění funkce slotu v reakci na signál z události následující
widget.signal.connect(slot)
Což znamená, že kdykoli a 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 klíčové mít na vysoké úrovni pohled na strukturu 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 poskytovaných PyQt5.
Adresářová struktura PyQt5
Toto jsou základní moduly, které používá Python's Qt binding, konkrétně PyQt5.
- Qt: Kombinuje všechny třídy/moduly uvedené níže do jednoho modulu. Výrazně zvyšuje paměť využívanou aplikací. Je však jednodušší spravovat rámec importováním 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.
- QtWidgets: Obsahuje 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 na nízké úrovni.
- 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()
- QRadioButton: Toto je vstupní pole s volitelným tlačítkem, podobně jako přepínače 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")
- QMenuBar: zobrazí vodorovný pruh nabídky v horní části okna. Do této lišty 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: používá se k rozdělení obsahu okna na více stránek, ke kterým lze přistupovat prostřednictvím různých karet v horní části widgetu. Skládá se ze dvou částí: lišta karet a stránka karet.
- QScrollBar: Používá se k vytváření posuvníků, které umožňují uživateli posouvat se v okně nahoru a dolů. Skládá se z pohyblivého posuvníku, posuvné dráhy a dvou tlačítek 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.
- QDock: Widget doku je dílčí okno 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 rozložení mřížky přebírá 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)
- Rozpětí sloupce (výchozí = 0)
Abyste tomu lépe porozuměli, 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 změníte motiv vaší aplikace z výchozího na Fusion
app.setStyle("Fusion")
Takto bude vypadat předchozí příklad v tématu Fusion
Další užitečnou funkcí pro motivaci 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_())
Tady 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 aby to fungovalo, budete ji muset importovat. Jakmile vytvoříte objekt QPalette, pomocí metody setColor() předejte název widgetu, jehož barvu chcete změnit, a barvu, kterou chcete nastavit.
qp.setColor(QPalette.Window, Qt.black)
Tím se změní barva okna na černou. Poté, co jste definovali své barevné schéma, použijte funkci setPalette() k použití 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.
Shrnutí
- PyQt je vazba pythonu pro C++ UI framework, Qt.
- PyQt4 a PyQt5 jsou dvě hlavní verze vyvinuté společností Riverbank Computing.
- Hlavní moduly frameworku PyQt jsou:
- Qt
- QtCore
- QtWidgets
- QtGui
- QtSql
- QtNetwork
- PyQt podporuje různé widgety jako:
- Tlačítka
- Textové popisky
- Textová pole
- Přepínače a zaškrtávací políčka
- Panely nástrojů a panely nabídek
- webový kit
- Tabs
- Doky
- V PyQt je interaktivita implementována pomocí signály si sloty.
- An událost je akce prováděná uživatelem v GUI (jako kliknutí na tlačítko).
- A signál je vyvoláno odpovídajícím widgetem, když na něm dojde k události.
- A štěrbina je funkce, která je připojena k signálu a provádí se, když je signál zvýšen.
- PyQt má robustní modul rozložení a podporuje pokročilý návrh a správu rozložení. Toto jsou dvě často používaná schémata rozložení v PyQt:
- Box Nákres
- Layout Grid
- PyQt designer vám umožňuje vytvářet vlastní témata pro GUI aplikace a má vestavěnou podporu pro styly.
- qtcreator Python lze použít k vytváření uživatelských rozhraní i samostatných aplikací.