Instaliranje PyQt5 u Linux
Da biste instalirali PyQt5 u najnovijoj verziji Ubuntu-a, pokrenite naredbu u nastavku:
$ sudo apt instalirati python3-pyqt5Ako koristite bilo koju drugu Linux distribuciju, potražite pojam "Pyqt5" u upravitelju paketa i instalirajte ga od tamo. Ili možete instalirati PyQt5 iz upravitelja paketa pip pomoću naredbe u nastavku:
$ pip instalirajte pyqt5Imajte na umu da ćete u nekim distribucijama možda morati koristiti naredbu pip3 za ispravnu instalaciju PyQt5.
Puni kod
Prethodno objavljujem puni kôd kako biste mogli bolje razumjeti kontekst za pojedine isječke koda objašnjene kasnije u članku. Ako ste upoznati s Pythonom i PyQt5, možete se samo pozvati na donji kod i preskočiti objašnjenje.
#!/ usr / bin / env python3import sys
iz PyQt5.QtWidgets uvoze QWidget, QApplication, QVBoxLayout, QHBoxLayout
iz PyQt5.QtWidgets uvoze QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
iz PyQt5.QtGui uvozi QKeySequence
iz PyQt5 uvozi Qt
Prozor klase (QWidget):
def __init __ (samo):
super().__u tome__()
sebe.file_path = Nema
sebe.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), samo)
sebe.open_new_file_shortcut.aktivirano.povezati (samo.open_new_file)
sebe.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), samo)
sebe.save_current_file_shortcut.aktivirano.povezati (samo.spremiti_datoteku_datoteka)
vbox = QVBoxLayout ()
text = "Datoteka bez naslova"
sebe.naslov = QLabel (tekst)
sebe.titula.setWordWrap (True)
sebe.titula.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (self.titula)
sebe.setLayout (vbox)
sebe.scrollable_text_area = QTextEdit ()
vbox.addWidget (self.pomično_površje_teksta)
def open_new_file (self):
sebe.put do datoteke, filter_tip = QFileDialog.getOpenFileName (self, "Otvori novu datoteku",
"", "Sve datoteke (*)")
ako ja.put_datoteke:
s otvorenim (self.put_datoteke, "r") kao f:
file_contents = f.čitati()
sebe.titula.setText (self.put_datoteke)
sebe.pomična_područja_teksta.setText (sadržaj_datoteke)
drugo:
sebe.invalid_path_alert_message ()
def save_current_file (self):
ako ne i sebe.put_datoteke:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Spremi ovu datoteku
kao ... "," "," Sve datoteke (*) ")
ako je put nove_datoteke:
sebe.put_datoteke = novi_put_datoteke
drugo:
sebe.invalid_path_alert_message ()
povratak False
file_contents = samo.pomična_područja_teksta.toPlainText ()
s otvorenim (self.put_datoteke, "w") kao f:
f.pisanje (sadržaj_datoteke)
sebe.titula.setText (self.put_datoteke)
def closeEvent (self, događaj):
messageBox = QMessageBox ()
title = "Zatvori prijavu?"
message = "UPOZORENJE !!\ n \ nAko napustite bez spremanja, sve promjene napravljene u datoteci
bit će izgubljeni.\ n \ nSpremite datoteku prije izlaska?"
odgovor = messageBox.pitanje (ja, naslov, poruka, messageBox.Da | messageBox.Ne |
messageBox.Otkaži, messageBox.Otkazati)
ako je odgovor == messageBox.Da:
return_value = self.spremi_teku_datoteke ()
ako return_value == False:
događaj.zanemariti()
elif reply == messageBox.Ne:
događaj.prihvatiti()
drugo:
događaj.zanemariti()
def invalid_path_alert_message (self):
messageBox = QMessageBox ()
messageBox.setWindowTitle ("Nevaljana datoteka")
messageBox.setText ("Odabrani naziv datoteke ili put nije valjan. Molimo odaberite a
valjana datoteka.")
messageBox.izvršiti ()
ako je __name__ == '__glavno__':
app = QApplication (sys.argv)
w = prozor ()
w.showMaximized ()
sys.izlaz (app.exec_ ())
Obrazloženje
Prvi dio koda samo uvozi module koji će se koristiti u cijelom uzorku:
import sysiz PyQt5.QtWidgets uvoze QWidget, QApplication, QVBoxLayout, QHBoxLayout
iz PyQt5.QtWidgets uvoze QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
iz PyQt5.QtGui uvozi QKeySequence
iz PyQt5 uvozi Qt
U sljedećem dijelu kreira se nova klasa nazvana “Window” koja nasljeđuje klasu “QWidget”. Klasa QWidget pruža najčešće korištene grafičke komponente u Qt-u. Korištenjem "super" možete osigurati da se vrati nadređeni Qt objekt.
Prozor klase (QWidget):def __init __ (samo):
super().__u tome__()
Neke su varijable definirane u sljedećem dijelu. Put datoteke prema zadanim je postavkama postavljen na "Ništa", a prečaci za otvaranje datoteke pomoću
sebe.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), samo)
sebe.open_new_file_shortcut.aktivirano.povezati (samo.open_new_file)
sebe.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), samo)
sebe.save_current_file_shortcut.aktivirano.povezati (samo.spremi_tekst_datoteke)
Korištenjem klase QVBoxLayout kreira se novi izgled kojem će se dodati podređeni widgeti. Oznaka poravnata prema sredini postavlja se za zadani naziv datoteke pomoću klase QLabel.
vbox = QVBoxLayout ()text = "Datoteka bez naslova"
sebe.naslov = QLabel (tekst)
sebe.titula.setWordWrap (True)
sebe.titula.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (self.titula)
sebe.setLayout (vbox)
Dalje, tekstualno područje dodaje se izgledu pomoću objekta QTextEdit. Dodatak QTextEdit pružit će vam uređivano područje za pomicanje s kojim možete raditi. Ovaj widget podržava tipično kopiranje, lijepljenje, izrezivanje, poništavanje, ponavljanje, odabir svih itd. tipkovni prečaci. Također možete upotrijebiti kontekstni izbornik desnim klikom unutar područja teksta.
sebe.scrollable_text_area = QTextEdit ()vbox.addWidget (self.pomično_površje_teksta)
Metoda "open_new_fie" poziva se kada korisnik dovrši
sebe.put do datoteke, filter_tip = QFileDialog.getOpenFileName (self, "Otvori novu datoteku", "",
"Sve datoteke (*)")
ako ja.put_datoteke:
s otvorenim (self.put_datoteke, "r") kao f:
file_contents = f.čitati()
sebe.titula.setText (self.put_datoteke)
sebe.pomična_područja_teksta.setText (sadržaj_datoteke)
drugo:
sebe.invalid_path_alert_message ()
Metoda "save_current_file" poziva se kad god korisnik dovrši
ako ne i sebe.put_datoteke:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Spremi ovu datoteku
kao ... "," "," Sve datoteke (*) ")
ako je put nove_datoteke:
sebe.put_datoteke = novi_put_datoteke
drugo:
sebe.invalid_path_alert_message ()
povratak False
file_contents = samo.pomična_područja_teksta.toPlainText ()
s otvorenim (self.put_datoteke, "w") kao f:
f.pisanje (sadržaj_datoteke)
sebe.titula.setText (self.put_datoteke)
Metoda “closeEvent” dio je API-ja za upravljanje događajima PyQt5. Ova se metoda poziva kad god korisnik pokuša zatvoriti prozor pomoću gumba za križ ili pritiskajući
messageBox = QMessageBox ()
title = "Zatvori prijavu?"
message = "UPOZORENJE !!\ n \ nAko napustite bez spremanja, učinit će se sve promjene u datoteci
biti izgubljen.\ n \ nSpremite datoteku prije izlaska?"
odgovor = messageBox.pitanje (ja, naslov, poruka, messageBox.Da | messageBox.Ne |
messageBox.Otkaži, messageBox.Otkazati)
ako je odgovor == messageBox.Da:
return_value = self.spremi_teku_datoteke ()
ako return_value == False:
događaj.zanemariti()
elif reply == messageBox.Ne:
događaj.prihvatiti()
drugo:
događaj.zanemariti()
Okvir upozorenja "nevaljana datoteka" nema nikakvih zvona i zvižduka. Samo prenosi poruku da se put datoteke ne može odrediti.
def invalid_path_alert_message (self):messageBox = QMessageBox ()
messageBox.setWindowTitle ("Nevaljana datoteka")
messageBox.setText ("Odabrani naziv datoteke ili put nije valjan. Odaberite valjanu datoteku.")
messageBox.izvršiti ()
Na kraju, glavna aplikacijska petlja za rukovanje događajima i crtanje widgeta pokreće se pomoću ".exec_ () ”metoda.
ako je __name__ == '__glavno__':app = QApplication (sys.argv)
w = prozor ()
w.showMaximized ()
sys.izlaz (app.exec_ ())
Pokretanje aplikacije
Samo spremite puni kod u tekstualnu datoteku, postavite ekstenziju datoteke na ".py ”, označite izvršnu datoteku i pokrenite je da biste pokrenuli aplikaciju. Na primjer, ako je naziv datoteke “simple_text_editor.py ”, trebate pokrenuti sljedeće dvije naredbe:
$ chmod + x jednostavni_tekst_uređivač.py$ ./ simple_text_editor.py
Stvari koje možete učiniti za poboljšanje koda
Gore objašnjeni kod dobro funkcionira za uređivač teksta golih kostiju. Međutim, možda neće biti koristan u praktične svrhe jer mu nedostaju mnoge značajke koje se često vide u dobrim uređivačima teksta. Kôd možete poboljšati dodavanjem novih značajki poput brojeva linija, isticanja linija, isticanja sintakse, više kartica, spremanja sesija, alatne trake, padajućih izbornika, otkrivanja promjene međuspremnika itd.
Zaključak
Ovaj se članak uglavnom fokusira na pružanje polazišta za stvaranje PyQt aplikacija. Ako u kodu pronađete pogreške ili želite nešto predložiti, povratne informacije su dobrodošle.