Hvordan skrive en enkel tekstredigerer i PYQT5

Hvordan skrive en enkel tekstredigerer i PYQT5
Denne artikkelen vil dekke en guide for å lage en enkel tekstredigerer i Python3 og PYQT5. QT5 er et sett med tverrplattformbiblioteker skrevet i C ++, hovedsakelig brukt til å lage rike grafiske applikasjoner. PYQT5 gir Python -bindinger for den nyeste versjonen av QT5. Alle kodeprøver i denne artikkelen er testet med Python 3.8.2 og PYQT5 versjon 5.14.1 på Ubuntu 20.04.

Installere pyqt5 i linux

For å installere PYQT5 i den siste versjonen av Ubuntu, kjør kommandoen nedenfor:

$ sudo apt install python3-pyqt5

Hvis du bruker noen annen Linux -distribusjon, kan du søke etter begrepet “PYQT5” i pakkebehandleren og installere den derfra. Alternativt kan du installere PYQT5 fra PIP Package Manager ved å bruke kommandoen nedenfor:

$ pip install pyqt5

Merk at i noen distribusjoner kan det hende du må bruke PIP3 -kommandoen for å installere PYQT5 riktig.

Full kode

Jeg legger ut full kode på forhånd, slik at du bedre kan forstå kontekst for individuelle kodebiter forklart senere i artikkelen. Hvis du er kjent med Python og Pyqt5, kan du bare henvise til koden nedenfor og hoppe over forklaringen.

#!/usr/bin/env python3
Importer Sys
Fra PYQT5.QtWidgets importerer qwidget, qapplication, qvboxlayout, qhboxlayout
Fra PYQT5.QtWidgets Importer QTextedit, Qlabel, QShortcut, QFileDialog, QMessageBox
Fra PYQT5.Qtgui import qkeySequence
fra PYQT5 import QT
Klassevindu (QWIDGET):
def __init __ (selv):
super().__i det__()
selv-.file_path = ingen
selv-.open_new_file_shortcut = qshortcut (qkeysequence ('ctrl+o'), selv)
selv-.open_new_file_shortcut.aktivert.Koble til (selv.open_new_file)
selv-.save_current_file_shortcut = qshortcut (qkeysequence ('ctrl+s'), selv)
selv-.save_current_file_shortcut.aktivert.Koble til (selv.save_current_file)
VBox = QVBoxLayout ()
tekst = "Untitled File"
selv-.tittel = Qlabel (tekst)
selv-.tittel.setwordwrap (sant)
selv-.tittel.setalignment (Qt.Qt.Aligncenter)
VBox.AddWidget (selv.tittel)
selv-.setslayout (vbox)
selv-.rullbar_text_area = qTextedit ()
VBox.AddWidget (selv.rullbar_text_area)
def open_new_file (selv):
selv-.file_path, filter_type = qfiledialog.getOpenFilename (selv, "Åpne ny fil",
"", "Alle filer (*)")
Hvis selv.file_path:
med åpen (selv.file_path, "r") som f:
file_contents = f.lese()
selv-.tittel.Settekst (selv.file_path)
selv-.rullbar_text_area.setText (file_contents)
ellers:
selv-.INVALID_PATH_ALERT_MESSAGE ()
def save_current_file (self):
hvis ikke selv.file_path:
new_file_path, filter_type = qfiledialog.getSaveFilename (selv, "Lagre denne filen
som ... "," "," alle filer (*) ")
Hvis new_file_path:
selv-.file_path = new_file_path
ellers:
selv-.INVALID_PATH_ALERT_MESSAGE ()
return falsk
file_contents = selv.rullbar_text_area.TopLainText ()
med åpen (selv.file_path, "w") som f:
f.skriv (file_contents)
selv-.tittel.Settekst (selv.file_path)
Def CloseVent (selv, begivenhet):
MessageBox = QMessageBox ()
title = "Avslutt applikasjon?""
melding = "Advarsel !!\ n \ nif du slutter uten å lagre, eventuelle endringer som er gjort i filen
Vil gå tapt.\ n \ nsave -filen før du slutter?""
Svar = MessageBox.Spørsmål (selv, tittel, melding, meldingskasse.Ja | meldingsboks.Nei |
meldingsboks.Avbryt, MessageBox.Avbryt)
Hvis svar == MessageBox.Ja:
return_value = self.save_current_file ()
Hvis return_value == FALSE:
begivenhet.overse()
Elif Svar == MessageBox.Nei:
begivenhet.aksepterer()
ellers:
begivenhet.overse()
def ugalid_path_alert_message (self):
MessageBox = QMessageBox ()
meldingsboks.setWindowTitle ("Ugyldig fil")
meldingsboks.setText ("valgt filnavn eller sti er ikke gyldig. Vennligst velg a
Gyldig fil.")
meldingsboks.exec ()
if __name__ == '__main__':
app = qapplication (sys.argv)
w = vindu ()
w.showMaximert ()
sys.Avslutt (app.exec_ ())

Forklaring

Den første delen av koden importerer bare moduler som skal brukes i hele prøven:

Importer Sys
Fra PYQT5.QtWidgets importerer qwidget, qapplication, qvboxlayout, qhboxlayout
Fra PYQT5.QtWidgets Importer QTextedit, Qlabel, QShortcut, QFileDialog, QMessageBox
Fra PYQT5.Qtgui import qkeySequence
fra PYQT5 import QT

I neste del opprettes en ny klasse som heter "Window" som arver fra "Qwidget" -klassen. Qwidget -klassen gir ofte brukte grafiske komponenter i QT. Ved å bruke "Super" kan du sikre at foreldre QT -objektet blir returnert.

Klassevindu (QWIDGET):
def __init __ (selv):
super().__i det__()

Noen variabler er definert i neste del. Filbanen er satt til “Ingen” som standard og snarveier for å åpne en fil ved hjelp av og lagre en fil som bruker er definert ved hjelp av QShortcut -klasse. Disse snarveiene er deretter koblet til sine respektive metoder som kalles når en bruker trykker på de definerte nøkkelkombinasjonene.

selv-.file_path = ingen
selv-.open_new_file_shortcut = qshortcut (qkeysequence ('ctrl+o'), selv)
selv-.open_new_file_shortcut.aktivert.Koble til (selv.open_new_file)
selv-.save_current_file_shortcut = qshortcut (qkeysequence ('ctrl+s'), selv)
selv-.save_current_file_shortcut.aktivert.Koble til (selv.save_current_file)

Ved hjelp av QVBoxLayout -klasse opprettes det en ny layout som Child Widgets vil bli lagt til. En senterjustert etikett er angitt for standardfilnavnet ved hjelp av QLabel-klasse.

VBox = QVBoxLayout ()
tekst = "Untitled File"
selv-.tittel = Qlabel (tekst)
selv-.tittel.setwordwrap (sant)
selv-.tittel.setalignment (Qt.Qt.Aligncenter)
VBox.AddWidget (selv.tittel)
selv-.setslayout (vbox)

Deretter legges et tekstområde lagt til oppsettet ved hjelp av et QTextedit -objekt. QTextedit -widgeten vil gi deg et redigerbart, rullbart område å jobbe med. Denne widgeten støtter typisk kopi, lim inn, kuttet, angre, omdrives, velg-all osv. tastatursnarveier. Du kan også bruke en høyreklikk -hurtigmeny i tekstområdet.

selv-.rullbar_text_area = qTextedit ()
VBox.AddWidget (selv.rullbar_text_area)

"Open_new_fie" -metoden kalles når en bruker fullfører tastatursnarveien. QFiledialog -klasse presenterer en filplukkerdialog til brukeren. Filbanen bestemmes etter at en bruker har valgt en fil fra plukkeren. Hvis filstien er gyldig, leses tekstinnhold fra filen og satt til QTextedit -widget. Dette gjør tekst synlig for brukeren, endrer tittelen til det nye filnavnet og fullfører prosessen med å åpne en ny fil. Hvis filstien av en eller annen grunn ikke kan bestemmes, vises en "ugyldig fil" -varsler for brukeren.

def open_new_file (selv):
selv-.file_path, filter_type = qfiledialog.getOpenFilename (selv, "Åpne ny fil", "",
"Alle filer (*)")
Hvis selv.file_path:
med åpen (selv.file_path, "r") som f:
file_contents = f.lese()
selv-.tittel.Settekst (selv.file_path)
selv-.rullbar_text_area.setText (file_contents)
ellers:
selv-.INVALID_PATH_ALERT_MESSAGE ()

Metoden “save_current_file” kalles når en bruker fullfører tastatursnarveien. I stedet for å hente en ny filsti, ber QFiledialog nå brukeren om å gi en bane. Hvis filbanen er gyldig, er innholdet synlig i QTextedit -widget skrevet til hele filstien, ellers vises en "ugyldig fil" -varsler. Tittelen på filen som for øyeblikket er redigert, blir også endret til det nye stedet som er gitt av brukeren.

def save_current_file (self):
hvis ikke selv.file_path:
new_file_path, filter_type = qfiledialog.getSaveFilename (selv, "Lagre denne filen
som ... "," "," alle filer (*) ")
Hvis new_file_path:
selv-.file_path = new_file_path
ellers:
selv-.INVALID_PATH_ALERT_MESSAGE ()
return falsk
file_contents = selv.rullbar_text_area.TopLainText ()
med åpen (selv.file_path, "w") som f:
f.skriv (file_contents)
selv-.tittel.Settekst (selv.file_path)

"CloseVent" -metoden er en del av PYQT5 -hendelseshåndterings -API. Denne metoden kalles når en bruker prøver å lukke et vindu ved hjelp av kryssknappen eller ved å trykke på tastekombinasjonen. Ved avfyring av den nære hendelsen blir brukeren vist en dialogboks med tre valg: "Ja", "Nei" og "Avbryt". “Ja” -knappen lagrer filen og lukker applikasjonen mens “Nei” -knappen lukker filen uten å lagre innholdet. “Avbryt” -knappen lukker dialogboksen og tar brukeren tilbake til applikasjonen.

Def CloseVent (selv, begivenhet):
MessageBox = QMessageBox ()
title = "Avslutt applikasjon?""
melding = "Advarsel !!\ n \ nif du slutter uten å lagre, vil endringer i filen vil
være tapt.\ n \ nsave -filen før du slutter?""
Svar = MessageBox.Spørsmål (selv, tittel, melding, meldingskasse.Ja | meldingsboks.Nei |
meldingsboks.Avbryt, MessageBox.Avbryt)
Hvis svar == MessageBox.Ja:
return_value = self.save_current_file ()
Hvis return_value == FALSE:
begivenhet.overse()
Elif Svar == MessageBox.Nei:
begivenhet.aksepterer()
ellers:
begivenhet.overse()

Varslingsboksen "Ugyldig fil" har ingen bjeller og fløyter. Det formidler bare meldingen om at filstien ikke kunne bestemmes.

def ugalid_path_alert_message (self):
MessageBox = QMessageBox ()
meldingsboks.setWindowTitle ("Ugyldig fil")
meldingsboks.setText ("valgt filnavn eller sti er ikke gyldig. Velg en gyldig fil.")
meldingsboks.exec ()

Til slutt startet den viktigste applikasjonssløyfen for hendelseshåndtering og tegning av widgeter ved å bruke ".exec_ () ”-metode.

if __name__ == '__main__':
app = qapplication (sys.argv)
w = vindu ()
w.showMaximert ()
sys.Avslutt (app.exec_ ())

Kjører appen

Bare lagre full kode i en tekstfil, sett filtypen til “.py ”, merk filen som kjøres og kjør den for å starte appen. For eksempel, hvis filnavnet er "simple_text_editor.py ”, du må kjøre etter to kommandoer:

$ chmod +x simple_text_editor.py
$ ./simple_text_editor.py

Ting du kan gjøre for å forbedre koden

Koden forklart ovenfor fungerer bra for en bareben-tekstredigerer. Imidlertid er det kanskje ikke nyttig for praktiske formål, da det mangler mange funksjoner som ofte er sett i gode tekstredaktører. Du kan forbedre koden ved å legge til nye funksjoner som linjetall, linjehøydepunkt, syntaksutheving, flere faner, øktsparing, verktøylinje, rullegardinmenyer, deteksjon av bufferendring osv.

Konklusjon

Denne artikkelen fokuserer hovedsakelig på å gi et startsted for å lage PYQT -apper. Hvis du finner feil i koden eller vil foreslå noe, er tilbakemelding velkommen.