PyQt5 vodič s primjerima: Izrada Python Grafička sučelja s Qt-om
⚡ Pametni sažetak
PyQt je Python povezivanje za višeplatformski Qt widget toolkit, omogućujući programerima izradu izvornih grafičkih korisničkih sučelja za stolna računala. Omotava više od šest stotina C++ klase koje pokrivaju prozore, gumbe, rasporede, signale, utore i teme za Windows, macOSi Linux.

Odjeljci u nastavku vode vas od osnova PyQt-a kroz instalaciju, osnovne widgete, izglede i teme s primjerima koje možete pokrenuti.
Što je PyQt?
PyQt je Python povezivanje Qt-a s alatima otvorenog koda, koji također funkcionira kao okvir za razvoj višeplatformskih aplikacija. Qt je popularan C++ okvir za pisanje GUI aplikacija za sve glavne desktop, mobilne i ugrađene platforme (podržava Linux, Windows, macOS, Android, iOS, Raspberry Pi i više).
PyQt je besplatni softver koji je razvila i održava tvrtka Riverbank Computing sa sjedištem u Engleskoj, dok je Qt razvila finska tvrtka pod nazivom The Qt Company.
Značajke PyQt-a
Evo važnih značajki PyQt-a:
PyQt se sastoji od više od šest stotina klasa koje pokrivaju niz značajki kao što su:
- Grafičko korisničko sučelje
- SQL baze podataka
- Web alati
- XML obrada
- Umrežavanje
Ove se značajke mogu kombinirati za stvaranje naprednih korisničkih sučelja, kao i samostalnih aplikacija. Mnoge velike tvrtke u svim industrijama koriste Qt. Neki primjeri su LG, Mercedes, AMD, Panasonic i Harman.
PyQt verzije
PyQt je dostupan u dva izdanja, PyQt4 i PyQt5. PyQt4 pruža povezujući kod za povezivanje verzija 4.x i 5.x Qt okvira, dok PyQt5 pruža povezivanje samo za verzije 5.x. Kao rezultat toga, PyQt5 nije unatrag kompatibilan sa zastarjelim modulima starije verzije. U ovom PyQt GUI tutorialu, PyQt5 će se koristiti za demonstraciju primjera. Osim ove dvije verzije, Riverbank Computing također pruža PyQt3D - Python Veze za Qt3D okvir. Qt3D je aplikacijski okvir koji se koristi za stvaranje sustava za simulaciju u stvarnom vremenu s 2D/3D renderiranjem.
Kako instalirati PyQt5
U ovom vodiču za PyQt5 vidjet ćemo dva načina instaliranja PyQt-a:
- Korištenje Wheel datoteka
- Izgradnja i instalacija iz izvora
Qt (izgovara se slatko) složen je sustav, a baza koda PyQt sadrži kompilirane C++ i Python kod ispod haube. Kao rezultat toga, izgradnja i instalacija iz izvornog koda je kompliciraniji proces u usporedbi s drugim Python biblioteke. Međutim, PyQt5 možete jednostavno instalirati pomoću kotačića.
Montaža s kotačima
Kotači su novi standard Python format pakiranja i distribucije. Jednostavno rečeno, kotač je ZIP arhiva s posebnim imenom i .whl ekstenzija datoteke. Kotači se mogu postaviti pomoću pipa (Pythonupravitelj paketa), koji je prema zadanim postavkama uključen u novije verzije Python.
Dakle, ako imate Python 3.4 ili noviji instaliran, već imate pip. Međutim, ako koristite stariju verziju Python, morate preuzeti i instalirati pip prije nego što nastavite. Upute možete potražiti na ovoj poveznici: https://pypi.org/project/pip/.
Za instalaciju PyQt5:
Korak 1) Otvorite naredbeni redak.
Otvorite naredbeni redak ili PowerShell u svom Windows stroj.
Korak 2) Upišite sljedeće.
pip install PyQt5
Korak 3) Instalacija uspjela.
Ovaj korak u ovom vodiču za PyQt5 će preuzeti paket PyQt5 whl (oko 50 MB) i instalirati ga na vaš sustav.
Alternativno, također možete preuzeti a Windows binarna datoteka za verziju Python instaliran na vašem računalu.
Kada je dovršen, prijeđite na sljedeći odjeljak u ovom vodiču za PyQt5 da biste napisali svoju prvu GUI aplikaciju.
Osnovni PyQt Concepts i Programi
Sada kada ste uspješno instalirali PyQt5 na svoje računalo, spremni ste za pisanje. Python GUI aplikacije.
Počnimo s jednostavnom aplikacijom u ovom PyQt5 tutorialu koja će prikazati prazan prozor na vašem ekranu.
Zapalite svoje Python IDLE i upišite sljedeće:
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_())
Spremite ga kao app.py (naziv nije važan) i pritisnite F5 za pokretanje programa. Alternativno, samo dvaput kliknite spremljenu datoteku za pokretanje aplikacije. Ako ste sve ispravno napravili, otvorit će se novi prozor s naslovom Guru99 kao što je prikazano dolje.
Odlično! Radi. Nije puno, ali je dovoljno za shvaćanje osnova. Sada u ovom PyQt tutorialu, pogledajmo detaljno što radi svaki od redaka u vašem programu.
from PyQt5.QtWidgets import QApplication, QWidget
Ova izjava uvozi sve module koji su vam potrebni za stvaranje GUI-ja u trenutni prostor naziva. Modul QtWidgets sadrži sve glavne widgete koje ćete koristiti u ovome Python Qt vodič.
app = QApplication(sys.argv)
Ovdje stvarate objekt klase QApplication. Ovaj korak je neophodan za PyQt5; svaka UI aplikacija mora stvoriti instancu QApplication, kao neku vrstu ulazne točke u aplikaciju. Ako ga ne izradite, prikazat će se pogreške.
sys.argv je popis parametara naredbenog retka koje možete proslijediti aplikaciji kada je pokrećete kroz ljusku ili tijekom automatizacije sučelja.
U ovom primjeru PyQt5 niste proslijedili nikakve argumente QApplication. Stoga ga možete zamijeniti i kodom u nastavku, a da ne morate ni uvoziti sys modul.
app = QApplication([])
w = QWidget()
Zatim napravimo objekt klase QWidget. QWidget je osnovna klasa svih UI objekata u Qt-u i gotovo sve što vidite u aplikaciji je widget. To uključuje dijaloge, tekstove, gumbe, trake i tako dalje. Značajka koja vam omogućuje dizajn složenih korisničkih sučelja je da widgeti mogu biti ugniježđeni, tj. možete imati widget unutar widgeta, koji je unutar još jednog widgeta. Vidjet ćete ovo na djelu u sljedećem odjeljku.
w.resize(300,300)
Metoda promjene veličine klase QWidget omogućuje vam postavljanje dimenzija bilo kojeg widgeta. U ovom slučaju promijenili ste veličinu prozora na 300 x 300 piksela.
Ovdje biste trebali imati na umu da se widgeti mogu ugniježđivati zajedno; najudaljeniji widget (tj. widget bez roditelja) naziva se Prozor.
w.setWindowTitle("Guru99")
Metoda setWindowTitle() omogućuje vam prosljeđivanje niza znakova kao argumenta koji će postaviti naslov prozora na niz znakova koji prosljeđujete. U primjeru PyQt5, prikazat će se naslovna traka Guru99.
w.show()
show() jednostavno prikazuje widget na ekranu monitora.
sys.exit(app.exec_())
Metoda app.exec_() pokreće Qt/C++ petlja događaja. Kao što znate, PyQt je uglavnom napisan u C++ i koristi mehanizam petlje događaja za implementaciju paralelnog izvršavanja. app.exec_() predaje kontrolu Qt-u, koji će zatvoriti aplikaciju samo kada je korisnik zatvori iz GUI-ja. Zato ctrl+c neće zatvoriti aplikaciju kao u drugim Python programe. Budući da Qt ima kontrolu nad aplikacijom, Python događaji se ne obrađuju osim ako ih ne postavimo unutar aplikacije. Također, imajte na umu da metoda exec ima podcrtu u svom nazivu; to je zato što je exec() već bila ključna riječ u Python a podcrta rješava sukob imenovanja.
Iza praznih prozora
U prethodnom odjeljku vidjeli ste kako napraviti osnovni widget u Qt-u. Sada je vrijeme za izradu nekih složenijih sučelja s kojima korisnici mogu doista komunicirati. Ponovno, pokrenite svoj IDLE i napiši sljedeće.
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_())
Spremite datoteku kao appone.py ili bilo što drugo i pritisnite F5 za pokretanje programa. Ako niste napravili nikakve pogreške, IDLE otvorit će novi prozor s nekim tekstom i gumbom kao što je prikazano u nastavku.
- Nakon što kliknete na gumb u prvom prozoru, otvorit će se novi okvir s porukom s tekstom koji ste napisali.
- Sada možete kliknuti na gumb Sakrij pojedinosti/Prikaži pojedinosti za uključivanje/isključivanje vidljivosti dodatnog teksta.
Kao što vidite, budući da nismo postavili naslov prozora u okviru s porukom, zadani naslov je bio dan pomoću Python sebe.
Sada kada radi, pogledajmo dodatni kod koji ste dodali prethodnom primjeru PyQt5.
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox
Ovo uvozi još neke widgete koje ste koristili u primjerima PyQt5, naime QLabel, QPushButton i 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_()
Ovdje ste definirali metodu pod nazivom dialog koja stvara widget okvira s porukom i postavlja dio teksta na gumbe i druga polja.
Metoda dijaloga poziva se iz glavnog bloka programa kada se pritisne gumb u određenom widgetu (u ovom slučaju, btn PushButton). Događaj klika pokrenut na tom gumbu uzrokuje izvršavanje ove funkcije. Takva se funkcija u Qt-u naziva slot, a o njoj ćete naučiti više signali i mjesta u narednim paragrafima.
if __name__ == "__main__": app = QApplication(sys.argv) w = QWidget() w.resize(300,300) w.setWindowTitle("Guru99")
Ovo je glavni dio aplikacije i, kao u prethodnom primjeru, počinjete stvaranjem instance QApplication nakon čega slijedi jednostavan widget, tj. instanca QWidget.
label = QLabel(w)
btn = QPushButton(w)
Dodali ste dva nova widgeta u ovu aplikaciju: QLabel i QPushButton. QLabel se koristi za ispis teksta koji se ne može uređivati ili rezerviranih mjesta unutar widgeta, dok se QPushButton koristi za stvaranje gumba na koji se može kliknuti.
Ovdje je važno primijetiti da kada kreirate label i btn objekte, prosljeđujete objekt prozora (w) konstruktorima QLabel i QPushButton. Ovako funkcionira gniježđenje u PyQt5. Da biste stvorili widget unutar drugog widgeta, proslijedite referencu nadređenog widgeta podređenom konstruktoru.
label.move(100,130) btn.move(110,150)
move() se koristi za postavljanje položaja widgeta u odnosu na njegov nadređeni widget. U prvom slučaju, oznaka će se pomaknuti 100px s lijeve strane i 130px s vrha prozora.
Slično, gumb će biti postavljen 110px od lijevog i 150px od vrha prozora. Ovaj primjer je grubi način postizanja izgleda i općenito se ne koristi u proizvodnji; ovdje je uključen samo u svrhu učenja. Qt podržava različite izglede koje ćete detaljno vidjeti u nadolazećim odjeljcima ovog vodiča za PyQt.
btn.clicked.connect(dialog)
Konačno, ovo je primjer signala i slotova u Qt-u. U aplikacijama temeljenim na GUI-ju, funkcije se izvršavaju na temelju radnji koje izvršava korisnik, poput zadržavanja pokazivača iznad elementa ili klika na gumb. Te se radnje nazivaju događaji. Podsjetimo se da metoda app.exec_() prenosi kontrolu na Qt događaj petlja. To je ono čemu služi petlja događaja: osluškivanje događaja i izvođenje radnji kao odgovor.
Kad god se dogodi neki događaj, poput klika korisnika na gumb, odgovarajući Qt widget pokreće a signal. Ovi se signali mogu povezati s Python Funkcije (kao dijaloška funkcija u ovom primjeru) tako da se funkcija izvršava kada se aktivira signal. Te se funkcije nazivaju mjesta na Qt jeziku.
Nakon toga, osnovna sintaksa za pokretanje slot funkcije kao odgovor na signal događaja je sljedeća:
widget.signal.connect(slot)
To znači da kad god signal pokreće a widget, povezani prorez funkcija će se izvršiti. Ukratko, Qt koristi signale i utore za komunikaciju između objekata i olakšavanje ponovne upotrebe komponenti i interaktivnosti.
Sada kada znate kako ugniježditi widgete i implementirati interakcije pomoću signala i utora, evo popisa korisnih widgeta i drugih klasa koje možete koristiti u svojim PyQt aplikacijama.
Komponente i widgeti
Postoji veliki broj widgeta dostupnih u PyQt-u za izradu GUI aplikacija. Međutim, s PyQt5, došlo je do preslagivanja klasa u različite module i revizija u licencama.
Stoga je ključno imati opći pregled strukture PyQt5. U ovom odjeljku vidjet ćete kako je PyQt5 interno organiziran i saznati više o različitim modulima, bibliotekama i API klasama koje PyQt5 pruža.
PyQt5 struktura direktorija
Ovo su temeljni moduli koje koristi PythonQt vezivanje, posebno PyQt5.
- QtKombinira sve dolje navedene klase/module u jedan modul. Znatno povećava memoriju koju aplikacija koristi. Međutim, lakše je upravljati okvirom uvozom samo jednog modula.
- QtCore: Sadrži osnovne negrafičke klase koje koriste drugi moduli. Ovo je mjesto gdje se implementiraju Qt petlja događaja, signali i povezivanje utora, itd.
- QtWidgetiSadrži većinu widgeta dostupnih u PyQt5.
- QtGui: Sadrži GUI komponente i proširuje QtCore modul.
- QtNetwork: Sadrži klase koje se koriste za implementaciju mrežnog programiranja kroz Qt. Podržava TCP poslužitelje, TCP utičnice, UDP utičnice, SSL rukovanje, mrežne sesije i DNS pretraživanja.
- QtMultimedia: pruža multimedijske funkcionalnosti niske razine.
- QtSql: implementira integraciju baze podataka za SQL baze podataka. Podržava ODBC, MySQL, Oracle, SQLitei PostgreSQL.
PyQt5 Widgeti
Evo popisa najčešće korištenih widgeta u PyQt5:
- QLineEdit: Ovo je polje za unos koje korisniku omogućuje unos jednog retka teksta.
line = QLineEdit()
- QRadioButton: Ovo je polje za unos s gumbom za odabir, slično radio gumbima u HTML-u.
rad = QRadioButton("button title") rad.setChecked(True) #to select the button by default.
- QComboBox: Koristi se za prikaz padajućeg izbornika s popisom stavki koje je moguće odabrati.
drop = QComboBox(w) drop.addItems(["item one", "item two", "item three"])
- QCheckBox: Prikazuje kvadratni okvir koji se može odabrati ispred oznake koja je označena ako je odabrana, slično radio gumbima.
check = QCheckBox("button title")
- QMenuBarPrikazuje horizontalnu traku izbornika na vrhu prozora. U ovu traku možete dodati samo objekte klase QMenu. Ti objekti QMenu mogu nadalje sadržavati nizove znakova, objekte QAction ili druge objekte QMenu.
- QToolBar: To je vodoravna traka ili okno koje se može pomicati unutar prozora. Može sadržavati gumbe i druge widgete.
- QTab: Koristi se za dijeljenje sadržaja prozora na više stranica kojima se može pristupiti putem različitih kartica na vrhu widgeta. Sastoji se od dva dijela: trake s karticama i stranice s karticama.
- QScrollBarKoristi se za stvaranje traka za pomicanje koje omogućuju korisniku pomicanje gore i dolje unutar prozora. Sastoji se od pomičnog klizača, klizača track i dva gumba za pomicanje klizača gore ili dolje.
scroll = QScrollBar()
- QSplitter: Razdjelnici se koriste za odvajanje sadržaja prozora tako da su widgeti ispravno grupirani i da ne izgledaju pretrpano. QSplitter je jedan od primarnih rukovatelja izgledom dostupnih u PyQt5 i koristi se za horizontalno i vertikalno dijeljenje sadržaja.
- QDockDock widget je podprozor s dva svojstva: može se premještati unutar glavnog prozora i može se usidriti izvan roditeljskog prozora na drugu lokaciju na zaslonu.
Izgledi i teme
U prethodnim primjerima PyQt5 samo ste koristili metode move() i resize() za postavljanje položaja widgeta u vašem GUI-ju.
Međutim, PyQt ima robustan mehanizam za upravljanje izgledom koji se može koristiti za stvaranje naprednih korisničkih sučelja za aplikacije. U ovom odjeljku naučit ćete o dvije važne klase koje se koriste u Qt-u za stvaranje i upravljanje izgledima.
- QBoxRaspored
- QGridLayout
QBoxRaspored
QBoxRaspored se koristi za poravnavanje podređenih widgeta izgleda u vodoravni ili okomiti red. Dvije interesne klase koje nasljeđuju od QBoxRaspored je:
- QHBoxIzgled: koristi se za vodoravno postavljanje podređenih widgeta.
- QVBoxRaspored: koristi se za okomito postavljanje podređenih widgeta.
Na primjer, ovako su tri gumba poravnata s QHBoxIzgled će izgledati.
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 ovako će izgledati u QV-uBoxIzgled.
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_())
Jedina funkcija koja u ovom trenutku treba bilo kakvo objašnjenje je metoda addWidget(). Koristi se za umetanje widgeta u HBox ili VBox raspored. Također se koristi u drugim izgledima gdje uzima različit broj parametara kao što ćete vidjeti u sljedećem odjeljku. Widgeti će se pojaviti unutar izgleda redoslijedom kojim ste ih umetnuli.
QGridLayout
QGridLayout se koristi za stvaranje sučelja u kojima su widgeti postavljeni u obliku mreže (poput matrice ili 2D polja). Za umetanje elemenata u raspored rešetke, možete upotrijebiti matrični prikaz za definiranje broja redaka i stupaca u rešetki, kao i položaj tih elemenata.
Na primjer, da biste stvorili mrežu 3*3 (tj. mrežu s tri retka i tri stupca), napisat ćete sljedeći kod:
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_())
Ovo će biti izlaz:
Metoda addWidget() u rasporedu mreže prima ove argumente:
- Objekt widgeta koji želite dodati u mrežu
- X-koordinata objekta
- Y-koordinata objekta
- Raspon retka (zadano = 0)
- Raspon stupaca (zadano = 0)
Za bolje razumijevanje, možete ručno umetnuti svaki widget kao što je prikazano dolje.
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_())
Ovako će izgledati mreža:
Također možete proslijediti parametre rowspan i colspan u addWidget() kako biste obuhvatili više od jednog retka ili stupca.
Na primjer,
grid.addWidget(QPushButton("Button five"),2,0,1,0)
Ovo će stvoriti gumb koji se proteže preko oba stupca.
Teme
PyQt5 dolazi s nekim ugrađenim temama koje možete koristiti u svojim aplikacijama. The setStyle() metoda koja se poziva na instanci QApplication koristi se za postavljanje određene teme u vašu aplikaciju.
Na primjer, dodavanjem sljedećeg retka koda promijenit ćete temu vaše aplikacije iz zadane u Fusion.
app.setStyle("Fusion")
Ovako će prethodni primjer izgledati u Fusion temi.
Još jedna korisna funkcija za temiranje vaših aplikacija je metoda setPalette(). Evo koda za promjenu boje različitih widgeta pomoću 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_())
Evo rezultata.
Da biste koristili metodu setPalette(), prvo trebate definirati paletu. To se postiže stvaranjem objekta klase QPalette.
qp = QPalette()
Imajte na umu da klasa QPalette pripada QtGui modulu i morat ćete je uvesti da bi ovo radilo. Nakon što ste kreirali objekt QPalette, upotrijebite metodu setColor() za prosljeđivanje naziva widgeta čiju boju želite promijeniti i boje koju želite postaviti.
qp.setColor(QPalette.Window, Qt.black)
Ovo će promijeniti boju prozora u crnu. Nakon što ste definirali shemu boja, upotrijebite funkciju setPalette() za primjenu palete na svoju aplikaciju.
app.setPalette(qp)
To je sve što trebate učiniti ako želite stvoriti neke osnovne teme za svoju aplikaciju. PyQt vam također omogućuje korištenje tablica stilova za definiranje izgleda vaših widgeta. Ako ste upoznati s CSS-om, možete jednostavno definirati napredne stilove za svoju aplikaciju koristeći Qt Style Sheets.












