Python

Sådan skriver du en simpel teksteditor i PyQt5

Sådan skriver du en simpel teksteditor i PyQt5
Denne artikel dækker en guide til oprettelse af en simpel teksteditor i Python3 og PyQt5. Qt5 er et sæt af platforme-biblioteker skrevet i C ++, der hovedsagelig bruges til at skabe rige grafiske applikationer. PyQt5 leverer Python-bindinger til den nyeste version af Qt5. Alle kodeeksempler i denne artikel er testet med Python 3.8.2 og PyQt5 version 5.14.1 på Ubuntu 20.04.

Installation af PyQt5 i Linux

For at installere PyQt5 i den nyeste version af Ubuntu skal du køre kommandoen nedenfor:

$ sudo apt installere python3-pyqt5

Hvis du bruger en anden Linux-distribution, skal du søge efter udtrykket “Pyqt5” i pakkehåndteringen og installere det derfra. Alternativt kan du installere PyQt5 fra pip-pakkehåndtering ved hjælp af kommandoen nedenfor:

$ pip installer pyqt5

Bemærk, at i nogle distributioner skal du muligvis bruge pip3-kommandoen til korrekt installation af PyQt5.

Fuld kode

Jeg sender på forhånd fuld kode, så du bedre kan forstå sammenhæng for individuelle kodestykker, der er forklaret senere i artiklen. Hvis du er fortrolig med Python og PyQt5, kan du bare henvise til koden nedenfor og springe forklaringen over.

#!/ 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 Vindue (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.aktiveret.forbinde (selv.åben_ny fil)
selv.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), selv)
selv.save_current_file_shortcut.aktiveret.forbinde (selv.save_current_file)
vbox = QVBoxLayout ()
text = "Untitled File"
selv.titel = QLabel (tekst)
selv.titel.setWordWrap (True)
selv.titel.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (selv.titel)
selv.setLayout (vbox)
selv.scrollable_text_area = QTextEdit ()
vbox.addWidget (selv.scrollable_text_area)
def open_new_file (selv):
selv.file_path, filter_type = QFileDialog.getOpenFileName (selv, "Åbn ny fil",
"", "Alle filer (*)")
hvis selv.file_path:
med åben (selv.file_path, "r") som f:
file_contents = f.Læs()
selv.titel.setText (selv.filsti)
selv.rulbar_tekstområde.setText (filindhold)
andet:
selv.ugyldig_sti_varsel_meddelelse ()
def save_current_file (selv):
hvis ikke selv.file_path:
new_file_path, filter_type = QFileDialog.getSaveFileName (selv, "Gem denne fil
som… "," "," Alle filer (*) ")
hvis ny_fil_sti:
selv.fil_sti = ny_fil_sti
andet:
selv.ugyldig_sti_varsel_meddelelse ()
returner Falsk
file_contents = selv.rulbar_tekstområde.toPlainText ()
med åben (selv.file_path, "w") som f:
f.skriv (filindhold)
selv.titel.setText (selv.filsti)
def closeEvent (selv, begivenhed):
messageBox = QMessageBox ()
title = "Afslut applikation?"
message = "ADVARSEL !!\ n \ nHvis du holder op uden at gemme, foretages der ændringer i filen
vil gå tabt.\ n \ nGem fil, inden du afslutter?"
svar = beskedboks.spørgsmål (selv, titel, besked, messageBox.Ja | beskedboks.Nej |
beskedboks.Annuller, beskedBoks.Afbestille)
hvis svar == messageBox.Ja:
return_value = selv.gem_strøm_fil ()
hvis return_value == False:
begivenhed.ignorere()
elif svar == messageBox.Ingen:
begivenhed.acceptere()
andet:
begivenhed.ignorere()
def ugyldig_sti_alert_meddelelse (selv):
messageBox = QMessageBox ()
beskedboks.setWindowTitle ("Ugyldig fil")
beskedboks.setText ("Valgt filnavn eller sti er ikke gyldig. Vælg en
gyldig fil.")
beskedboks.udføre ()
hvis __name__ == '__main__':
app = QApplication (sys.argv)
w = Vindue ()
w.showMaksimeret ()
sys.exit (app.exec_ ())

Forklaring

Den første del af koden importerer bare moduler, der vil blive brugt i 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 den næste del oprettes en ny klasse kaldet "Window", der arver fra "QWidget" -klassen. QWidget-klassen indeholder ofte anvendte grafiske komponenter i Qt. Ved at bruge “super” kan du sikre, at det overordnede Qt-objekt returneres.

klasse Vindue (QWidget):
def __init __ (selv):
super().__i det__()

Nogle variabler er defineret i den næste del. Filstien er som standard indstillet til "Ingen" og genveje til åbning af en fil ved hjælp af og gemme en fil ved hjælp af defineres ved hjælp af klasse QShortcut. Disse genveje forbindes derefter til deres respektive metoder, der kaldes, hver gang en bruger trykker på de definerede tastekombinationer.

selv.file_path = Ingen
selv.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), selv)
selv.open_new_file_shortcut.aktiveret.forbinde (selv.åben_ny fil)
selv.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), selv)
selv.save_current_file_shortcut.aktiveret.forbinde (selv.save_current_file)

Ved hjælp af QVBoxLayout-klasse oprettes et nyt layout, som underordnede widgets tilføjes. En centerjusteret etiket indstilles til standardfilnavnet ved hjælp af klasse QLabel.

vbox = QVBoxLayout ()
text = "Untitled File"
selv.titel = QLabel (tekst)
selv.titel.setWordWrap (True)
selv.titel.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (selv.titel)
selv.setLayout (vbox)

Dernæst tilføjes et tekstområde til layoutet ved hjælp af et QTextEdit-objekt. QTextEdit-widget'en giver dig et redigerbart, rullbart område at arbejde med. Denne widget understøtter typisk kopi, indsæt, klip, fortryd, gentag, vælg alt osv. tastaturgenveje. Du kan også bruge en højreklik-genvejsmenu i tekstområdet.

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

Metoden “open_new_fie” kaldes, når en bruger fuldfører tastaturgenvej. QFileDialog klasse præsenterer en filvælgerdialog for brugeren. Filstien bestemmes, når en bruger vælger en fil fra vælgeren. Hvis filstien er gyldig, læses tekstindholdet fra filen og indstilles til QTextEdit-widget. Dette gør teksten synlig for brugeren, ændrer titlen til det nye filnavn og afslutter processen med at åbne en ny fil. Hvis filstien af ​​en eller anden grund ikke kan bestemmes, vises en "ugyldig fil" -alarmboks til brugeren.

def open_new_file (selv):
selv.file_path, filter_type = QFileDialog.getOpenFileName (selv, "Åbn ny fil", "",
"Alle filer (*)")
hvis selv.file_path:
med åben (selv.file_path, "r") som f:
file_contents = f.Læs()
selv.titel.setText (selv.filsti)
selv.rulbar_tekstområde.setText (filindhold)
andet:
selv.ugyldig_sti_varsel_meddelelse ()

Metoden “save_current_file” kaldes, hver gang en bruger fuldfører tastaturgenvej. I stedet for at hente en ny filsti beder QFileDialog nu brugeren om at angive en sti. Hvis filstien er gyldig, skrives indholdet, der er synligt i QTextEdit-widgeten, til den fulde filsti, ellers vises en advarselsboks om "ugyldig fil". Titlen på den fil, der aktuelt redigeres, ændres også til den nye placering, der leveres af brugeren.

def save_current_file (selv):
hvis ikke selv.file_path:
new_file_path, filter_type = QFileDialog.getSaveFileName (selv, "Gem denne fil
som… "," "," Alle filer (*) ")
hvis ny_fil_sti:
selv.fil_sti = ny_fil_sti
andet:
selv.ugyldig_sti_varsel_meddelelse ()
returner Falsk
file_contents = selv.rulbar_tekstområde.toPlainText ()
med åben (selv.file_path, "w") som f:
f.skriv (filindhold)
selv.titel.setText (selv.filsti)

Metoden “closeEvent” er en del af PyQt5 API til begivenhedshåndtering. Denne metode kaldes, når en bruger forsøger at lukke et vindue ved hjælp af krydsknappen eller ved at trykke tastekombination. Ved udløsningen af ​​den lukkede begivenhed vises brugeren en dialogboks med tre valg: “Ja”, “Nej” og “Annuller”. “Ja” -knappen gemmer filen og lukker applikationen, mens knappen “Nej” lukker filen uden at gemme indholdet. Knappen “Annuller” lukker dialogboksen og fører brugeren tilbage til applikationen.

def closeEvent (selv, begivenhed):
messageBox = QMessageBox ()
title = "Afslut applikation?"
message = "ADVARSEL !!\ n \ nHvis du holder op uden at gemme, foretages eventuelle ændringer i filen
gå tabt.\ n \ nGem fil, inden du afslutter?"
svar = beskedboks.spørgsmål (selv, titel, besked, messageBox.Ja | beskedboks.Nej |
beskedboks.Annuller, beskedBoks.Afbestille)
hvis svar == messageBox.Ja:
return_value = selv.gem_strøm_fil ()
hvis return_value == False:
begivenhed.ignorere()
elif svar == messageBox.Ingen:
begivenhed.acceptere()
andet:
begivenhed.ignorere()

Advarselsfeltet "ugyldig fil" har ingen klokker og fløjter. Det formidler bare beskeden om, at filstien ikke kunne bestemmes.

def ugyldig_sti_alert_meddelelse (selv):
messageBox = QMessageBox ()
beskedboks.setWindowTitle ("Ugyldig fil")
beskedboks.setText ("Valgt filnavn eller sti er ikke gyldig. Vælg en gyldig fil.")
beskedboks.udføre ()

Endelig startes den primære applikationssløjfe til håndtering af begivenheder og tegning af widgets ved hjælp af ".exec_ () ”metode.

hvis __name__ == '__main__':
app = QApplication (sys.argv)
w = Vindue ()
w.showMaksimeret ()
sys.exit (app.exec_ ())

Kører appen

Gem bare fuld kode i en tekstfil, indstil filtypen til “.py ”, marker filen eksekverbar og kør den for at starte appen. For eksempel, hvis filnavnet er “simple_text_editor.py ”, skal du køre efter to kommandoer:

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

Ting, du kan gøre for at forbedre koden

Koden forklaret ovenfor fungerer fint for en tekstbehandler med bare ben. Det kan dog ikke være nyttigt til praktiske formål, da det mangler mange funktioner, der ofte ses i gode teksteditorer. Du kan forbedre koden ved at tilføje nye funktioner som linjenumre, linjemarkering, syntaksfremhævning, flere faner, sessionbesparelse, værktøjslinje, rullemenuer, bufferændringsdetektering osv.

Konklusion

Denne artikel fokuserer primært på at give et udgangspunkt for oprettelse af PyQt-apps. Hvis du finder fejl i koden eller vil foreslå noget, er feedback velkommen.

Vulkan til Linux-brugere
Med hver nye generation af grafikkort ser vi spiludviklere skubbe grænserne for grafisk troskab og komme et skridt tættere på fotorealisme. Men på tro...
OpenTTD vs Simutrans
Oprettelse af din egen transportsimulering kan være sjovt, afslappende og ekstremt lokkende. Derfor skal du sørge for at prøve så mange spil som mulig...
OpenTTD Tutorial
OpenTTD er et af de mest populære forretningssimuleringsspil derude. I dette spil skal du oprette en vidunderlig transportvirksomhed. Du starter dog i...