Python

Hvordan skrive en enkel teksteditor i PyQt5

Hvordan skrive en enkel teksteditor i PyQt5
Denne artikkelen vil dekke en guide om hvordan du lager en enkel tekstredigerer i Python3 og PyQt5. Qt5 er et sett med plattformbiblioteker skrevet i C ++, hovedsakelig brukt til å lage rike grafiske applikasjoner. PyQt5 gir Python-bindinger for den nyeste versjonen av Qt5. Alle kodeeksemplene 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 nyeste versjonen av Ubuntu, kjør kommandoen nedenfor:

$ sudo apt installere python3-pyqt5

Hvis du bruker en annen Linux-distribusjon, kan du søke etter begrepet "Pyqt5" ​​i pakkehåndtereren og installere det derfra. Alternativt kan du installere PyQt5 fra pip-pakkebehandling ved å bruke kommandoen nedenfor:

$ pip installer pyqt5

Merk at i noen distribusjoner må du kanskje bruke pip3-kommandoen for å installere PyQt5 riktig.

Full kode

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

#!/ usr / bin / env python3
importer sys
fra PyQt5.QtWidgets importerer QWidget, QApplication, QVBoxLayout, QHBoxLayout
fra PyQt5.QtWidgets importerer QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
fra PyQt5.QtGui importerer QKeySequence
fra PyQt5 importerer Qt
klasse Vindu (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 (selv.open_new_file)
selv-.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), selv)
selv-.save_current_file_shortcut.aktivert.koble (selv.save_current_file)
vbox = QVBoxLayout ()
text = "Uten tittel fil"
selv-.title = QLabel (tekst)
selv-.tittel.setWordWrap (True)
selv-.tittel.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (selvtill.tittel)
selv-.setLayout (vbox)
selv-.scrollable_text_area = QTextEdit ()
vbox.addWidget (selvtill.rullbart_tekstområde)
def open_new_file (selv):
selv-.file_path, filter_type = QFileDialog.getOpenFileName (selv, "Åpne ny fil",
"", "Alle filer (*)")
hvis selv.file_path:
med åpen (selvtillit.file_path, "r") som f:
file_contents = f.lese()
selv-.tittel.setText (selv.file_path)
selv-.rullbart_tekstområde.setText (file_contents)
ellers:
selv-.invalid_path_alert_message ()
def save_current_file (selv):
hvis ikke selv.file_path:
new_file_path, filter_type = QFileDialog.getSaveFileName (selv, "Lagre denne filen
som ... "," "," Alle filer (*) ")
hvis ny_fil_sti:
selv-.file_path = new_file_path
ellers:
selv-.invalid_path_alert_message ()
returner Falsk
file_contents = selvtillit.rullbart_tekstområde.toPlainText ()
med åpen (selvtillit.file_path, "w") som f:
f.skriv (filinnhold)
selv-.tittel.setText (selv.file_path)
def closeEvent (selv, begivenhet):
messageBox = QMessageBox ()
title = "Avslutt søknad?"
message = "ADVARSEL !!\ n \ nHvis du slutter uten å lagre, blir det gjort endringer i filen
Vil gå tapt.\ n \ nLagre filen før du slutter?"
svar = meldingsboks.spørsmål (selv, tittel, melding, messageBox.Ja | meldingsboks.Nei |
meldingsboks.Avbryt, meldingBoks.Avbryt)
hvis svar == meldingBoks.Ja:
return_value = selvtillit.save_current_file ()
if return_value == False:
begivenhet.overse()
elif svar == meldingBoks.Nei:
begivenhet.aksepterer()
ellers:
begivenhet.overse()
def invalid_path_alert_message (selv):
messageBox = QMessageBox ()
meldingsboks.setWindowTitle ("Ugyldig fil")
meldingsboks.setText ("Valgt filnavn eller sti er ikke gyldig. Velg en
gyldig fil.")
meldingsboks.utføre ()
hvis __name__ == '__main__':
app = QApplication (sys.argv)
w = Vindu ()
w.visMaksimert ()
sys.exit (app.exec_ ())

Forklaring

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

importer sys
fra PyQt5.QtWidgets importerer QWidget, QApplication, QVBoxLayout, QHBoxLayout
fra PyQt5.QtWidgets importerer QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
fra PyQt5.QtGui importerer QKeySequence
fra PyQt5 importerer Qt

I neste del opprettes en ny klasse kalt “Window” som arver fra “QWidget” -klassen. QWidget-klassen gir ofte brukte grafiske komponenter i Qt. Ved å bruke “super” kan du sikre at det overordnede Qt-objektet returneres.

klasse Vindu (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 ved hjelp av defineres ved bruk av klasse QShortcut. Disse snarveiene kobles deretter til deres respektive metoder som kalles når en bruker trykker på de definerte tastekombinasjonene.

selv-.file_path = Ingen
selv-.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), selv)
selv-.open_new_file_shortcut.aktivert.koble (selv.open_new_file)
selv-.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), selv)
selv-.save_current_file_shortcut.aktivert.koble (selv.save_current_file)

Ved bruk av QVBoxLayout-klasse opprettes et nytt oppsett som underordnede widgets vil bli lagt til. En senterjustert etikett er angitt for standardfilnavnet ved bruk av QLabel-klassen.

vbox = QVBoxLayout ()
text = "Uten tittel fil"
selv-.title = QLabel (tekst)
selv-.tittel.setWordWrap (True)
selv-.tittel.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (selvtill.tittel)
selv-.setLayout (vbox)

Deretter legges et tekstområde til layoutet ved hjelp av et QTextEdit-objekt. QTextEdit-modulen gir deg et redigerbart, rullbart område å jobbe med. Denne widgeten støtter typisk kopiering, lim inn, klipp ut, angre, gjør om, velg alt osv. tastatursnarveier. Du kan også bruke en høyreklikk hurtigmeny i tekstområdet.

selv-.scrollable_text_area = QTextEdit ()
vbox.addWidget (selvtill.scrollable_text_area)

"Open_new_fie" -metoden kalles når en bruker fullfører hurtigtast. QFileDialog-klassen presenterer en dialogbok for filvelger for brukeren. Filbanen bestemmes etter at en bruker har valgt en fil fra plukkeren. Hvis filbanen er gyldig, leses tekstinnholdet fra filen og settes til QTextEdit-widget. Dette gjør teksten synlig for brukeren, endrer tittelen til det nye filnavnet og fullfører prosessen med å åpne en ny fil. Hvis filbanen av en eller annen grunn ikke kan bestemmes, vises en "ugyldig fil" -varsel 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 (selvtillit.file_path, "r") som f:
file_contents = f.lese()
selv-.tittel.setText (selv.file_path)
selv-.rullbart_tekstområde.setText (file_contents)
ellers:
selv-.invalid_path_alert_message ()

"Save_current_file" -metoden kalles når en bruker fullfører hurtigtast. I stedet for å hente en ny filbane, ber QFileDialog nå brukeren om å oppgi en bane. Hvis filbanen er gyldig, skrives innholdet som er synlig i QTextEdit-widgeten til hele filbanen, ellers vises en "ugyldig fil" -varsel. Tittelen på filen som for øyeblikket redigeres, endres også til den nye plasseringen som er gitt av brukeren.

def save_current_file (selv):
hvis ikke selv.file_path:
new_file_path, filter_type = QFileDialog.getSaveFileName (selv, "Lagre denne filen
som ... "," "," Alle filer (*) ")
hvis ny_fil_sti:
selv-.file_path = new_file_path
ellers:
selv-.invalid_path_alert_message ()
returner Falsk
file_contents = selvtillit.rullbart_tekstområde.toPlainText ()
med åpen (selvtillit.file_path, "w") som f:
f.skriv (filinnhold)
selv-.tittel.setText (selv.file_path)

Metoden “closeEvent” er en del av PyQt5 API for hendelsesbehandling. Denne metoden kalles når en bruker prøver å lukke et vindu ved hjelp av kryss-knappen eller ved å trykke tastekombinasjon. Ved avfyring av lukkehendelsen vises brukeren 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 closeEvent (selv, begivenhet):
messageBox = QMessageBox ()
title = "Avslutt søknad?"
message = "ADVARSEL !!\ n \ nHvis du slutter uten å lagre, blir alle endringer i filen gjort
være tapt.\ n \ nLagre filen før du slutter?"
svar = meldingsboks.spørsmål (selv, tittel, melding, messageBox.Ja | meldingsboks.Nei |
meldingsboks.Avbryt, meldingBoks.Avbryt)
hvis svar == meldingBoks.Ja:
return_value = selvtillit.save_current_file ()
if return_value == False:
begivenhet.overse()
elif svar == meldingBoks.Nei:
begivenhet.aksepterer()
ellers:
begivenhet.overse()

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

def invalid_path_alert_message (selv):
messageBox = QMessageBox ()
meldingsboks.setWindowTitle ("Ugyldig fil")
meldingsboks.setText ("Valgt filnavn eller sti er ikke gyldig. Velg en gyldig fil.")
meldingsboks.utføre ()

Til slutt startes den viktigste applikasjonssløyfen for hendelsesbehandling og tegning av widgets ved å bruke “.exec_ () ”-metoden.

hvis __name__ == '__main__':
app = QApplication (sys.argv)
w = Vindu ()
w.visMaksimert ()
sys.exit (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 ”, må du 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 tekstbehandler med bare bein. Det kan imidlertid ikke være nyttig for praktiske formål, da det mangler mange funksjoner som ofte sees i gode tekstredigerere. Du kan forbedre koden ved å legge til nye funksjoner som linjenumre, linjeheving, syntaksheving, flere faner, øktlagring, verktøylinje, rullegardinmenyer, deteksjon av bufferendring osv.

Konklusjon

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

Topp 10 spill å spille på Ubuntu
Windows-plattformen har vært en av de dominerende plattformene for spill på grunn av den enorme andelen spill som utvikles i dag for å støtte Windows ...
5 beste arkadespill for Linux
I dag er datamaskiner seriøse maskiner som brukes til spill. Hvis du ikke kan få den nye høye poengsummen, vil du vite hva jeg mener. I dette innlegge...
Kamp for Wesnoth 1.1. 3.6 Utvikling utgitt
Kamp for Wesnoth 1.1. 3.6 utgitt i forrige måned, er den sjette utgivelsen i 1.1. 3.x-serien, og den leverer en rekke forbedringer, spesielt til bruke...