Piton

Kako napisati jednostavan uređivač teksta u PyQt5

Kako napisati jednostavan uređivač teksta u PyQt5
Ovaj će članak obuhvatiti vodič za stvaranje jednostavnog uređivača teksta u Python3 i PyQt5. Qt5 je skup višeplatnih biblioteka napisanih na jeziku C ++, koji se uglavnom koristi za stvaranje bogatih grafičkih aplikacija. PyQt5 pruža Python veze za najnoviju verziju Qt5. Svi uzorci koda u ovom članku testirani su s Pythonom 3.8.2 i PyQt5, verzija 5.14.1 na Ubuntu 20.04.

Instaliranje PyQt5 u Linux

Da biste instalirali PyQt5 u najnovijoj verziji Ubuntu-a, pokrenite naredbu u nastavku:

$ sudo apt instalirati python3-pyqt5

Ako 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 pyqt5

Imajte 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 python3
import 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 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

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 i spremanje datoteke pomoću definiraju se pomoću klase QShortcut. Ovi se prečaci zatim povezuju s njihovim odgovarajućim metodama koje se pozivaju kad god korisnik pritisne definirane kombinacije tipki.

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.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 tipkovni prečac. Klasa QFileDialog predstavlja dijalog za odabir datoteka korisniku. Put do datoteke određuje se nakon što korisnik odabere datoteku iz birača. Ako je put do datoteke valjan, tekst se čita iz datoteke i postavlja na QTextEdit widget. To čini tekst vidljivim korisniku, mijenja naslov u novo ime datoteke i dovršava postupak otvaranja nove datoteke. Ako se iz nekog razloga put datoteke ne može odrediti, korisniku se prikazuje okvir upozorenja "nevaljana datoteka".

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 ()

Metoda "save_current_file" poziva se kad god korisnik dovrši tipkovni prečac. Umjesto dohvaćanja nove staze datoteke, QFileDialog sada traži od korisnika da navede put. Ako je put do datoteke valjan, sadržaj vidljiv u widgetu QTextEdit zapisuje se na puni put do datoteke, inače se prikazuje okvir upozorenja "nevaljana datoteka". Naslov datoteke koja se trenutno uređuje također se mijenja na novo mjesto koje je osigurao korisnik.

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)

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 kombinacija tipki. Prilikom aktiviranja događaja zatvaranja, korisniku se prikazuje dijaloški okvir s tri mogućnosti: "Da", "Ne" i "Otkaži". Gumb "Da" sprema datoteku i zatvara program, dok gumb "Ne" zatvara datoteku bez spremanja sadržaja. Gumb "Otkaži" zatvara dijaloški okvir i vraća korisnika natrag u aplikaciju.

def closeEvent (self, događaj):
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.

Kako snimiti i struji svoju igraću sesiju na Linuxu
U prošlosti se igranje igara smatralo samo hobijem, ali s vremenom je igračka industrija zabilježila ogroman rast u pogledu tehnologije i broja igrača...
Najbolje igre za ručno praćenje
Oculus Quest nedavno je predstavio sjajnu ideju ručnog praćenja bez kontrolera. Sa sve većim brojem igara i aktivnosti koje izvršavaju podršku bilo fo...
Kako prikazati OSD prekrivač u aplikacijama i igrama na cijelom zaslonu za Linux
Igranje igara preko cijelog zaslona ili upotreba aplikacija u režimu preko cijelog zaslona bez ometanja može vas odsjeći od relevantnih informacija o ...