Pytonorm

Hur man skriver en enkel textredigerare i PyQt5

Hur man skriver en enkel textredigerare i PyQt5
Den här artikeln kommer att täcka en guide om hur du skapar en enkel textredigerare i Python3 och PyQt5. Qt5 är en uppsättning plattformsbibliotek skrivna i C ++, som huvudsakligen används för att skapa rika grafiska applikationer. PyQt5 tillhandahåller Python-bindningar för den senaste versionen av Qt5. Alla kodprover i den här artikeln testas med Python 3.8.2 och PyQt5 version 5.14.1 på Ubuntu 20.04.

Installerar PyQt5 i Linux

För att installera PyQt5 i den senaste versionen av Ubuntu, kör du kommandot nedan:

$ sudo apt installera python3-pyqt5

Om du använder någon annan Linux-distribution, sök efter termen “Pyqt5” i pakethanteraren och installera den därifrån. Alternativt kan du installera PyQt5 från pip-pakethanteraren med kommandot nedan:

$ pip installera pyqt5

Observera att i vissa distributioner kan du behöva använda pip3-kommandot för att korrekt installera PyQt5.

Fullständig kod

Jag publicerar fullständig kod i förväg så att du bättre kan förstå sammanhanget för enskilda kodavsnitt som förklaras senare i artikeln. Om du känner till Python och PyQt5 kan du bara hänvisa till koden nedan och hoppa över förklaringen.

#!/ usr / bin / env python3
importera sys
från PyQt5.QtWidgets importerar QWidget, QApplication, QVBoxLayout, QHBoxLayout
från PyQt5.QtWidgets importerar QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
från PyQt5.QtGui importerar QKeySequence
från PyQt5 importerar Qt
klassfönster (QWidget):
def __init __ (själv):
super().__i det__()
själv.file_path = Ingen
själv.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), själv)
själv.open_new_file_shortcut.aktiverad.ansluta (själv.open_new_file)
själv.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), själv)
själv.save_current_file_shortcut.aktiverad.ansluta (själv.save_current_file)
vbox = QVBoxLayout ()
text = "Namnlös fil"
själv.title = QLabel (text)
själv.titel.setWordWrap (True)
själv.titel.setAlignment (Qt.Qt.Centrera i linje med)
vbox.addWidget (själv.titel)
själv.setLayout (vbox)
själv.scrollable_text_area = QTextEdit ()
vbox.addWidget (själv.rullbart_text_område)
def open_new_file (själv):
själv.file_path, filter_type = QFileDialog.getOpenFileName (själv, "Öppna ny fil",
"", "Alla filer (*)")
om själv.sökväg:
med öppen (själv.file_path, "r") som f:
file_contents = f.läsa()
själv.titel.setText (själv.sökväg)
själv.rullningsbart_textområde.setText (filinnehåll)
annan:
själv.invalid_path_alert_message ()
def save_current_file (själv):
om inte själv.sökväg:
new_file_path, filter_type = QFileDialog.getSaveFileName (själv, "Spara den här filen
som ... "," "," Alla filer (*) ")
if new_file_path:
själv.file_path = new_file_path
annan:
själv.invalid_path_alert_message ()
återvänd Falskt
file_contents = själv.rullningsbart_textområde.toPlainText ()
med öppen (själv.file_path, "w") som f:
f.skriv (filinnehåll)
själv.titel.setText (själv.sökväg)
def closeEvent (själv, händelse):
messageBox = QMessageBox ()
title = "Avsluta ansökan?"
meddelande = "VARNING !!\ n \ nOm du slutar utan att spara, görs ändringar i filen
kommer att förloras.\ n \ n Spara filen innan du slutar?"
svara = meddelandebox.fråga (själv, titel, meddelande, messageBox.Ja | meddelandebox.Nej |
meddelandebox.Avbryt, meddelandeBox.Avbryt)
om svar == meddelandeBox.Ja:
return_value = själv.save_current_file ()
if return_value == False:
händelse.strunta i()
elif svar == meddelandeBox.Nej:
händelse.acceptera()
annan:
händelse.strunta i()
def invalid_path_alert_message (själv):
messageBox = QMessageBox ()
meddelandebox.setWindowTitle ("Ogiltig fil")
meddelandebox.setText ("Valt filnamn eller sökväg är inte giltigt. Välj en
giltig fil.")
meddelandebox.exec ()
om __name__ == '__main__':
app = QApplication (sys.argv)
w = Fönster ()
w.visaMaximerad ()
sys.exit (app.exec_ ())

Förklaring

Den första delen av koden importerar bara moduler som kommer att användas i hela provet:

importera sys
från PyQt5.QtWidgets importerar QWidget, QApplication, QVBoxLayout, QHBoxLayout
från PyQt5.QtWidgets importerar QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
från PyQt5.QtGui importerar QKeySequence
från PyQt5 importerar Qt

I nästa del skapas en ny klass som heter "Window" som ärver från "QWidget" -klassen. QWidget-klassen tillhandahåller vanliga grafiska komponenter i Qt. Genom att använda “super” kan du se till att det överordnade Qt-objektet returneras.

klassfönster (QWidget):
def __init __ (själv):
super().__i det__()

Vissa variabler definieras i nästa del. Filvägen är som standard inställd på "Ingen" och genvägar för att öppna en fil med och spara en fil med definieras med hjälp av QShortcut-klassen. Dessa genvägar kopplas sedan till sina respektive metoder som anropas när en användare trycker på de definierade tangentkombinationerna.

själv.file_path = Ingen
själv.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), själv)
själv.open_new_file_shortcut.aktiverad.ansluta (själv.open_new_file)
själv.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), själv)
själv.save_current_file_shortcut.aktiverad.ansluta (själv.save_current_file)

Med hjälp av QVBoxLayout-klassen skapas en ny layout som underordnade widgets läggs till. En mittjusterad etikett ställs in för standardfilnamnet med hjälp av QLabel-klassen.

vbox = QVBoxLayout ()
text = "Namnlös fil"
själv.title = QLabel (text)
själv.titel.setWordWrap (True)
själv.titel.setAlignment (Qt.Qt.Centrera i linje med)
vbox.addWidget (själv.titel)
själv.setLayout (vbox)

Därefter läggs ett textområde till layouten med ett QTextEdit-objekt. QTextEdit-widgeten ger dig ett redigerbart, rullningsbart område att arbeta med. Denna widget stöder typisk kopiering, klistra in, klipp ut, ångra, göra om, markera allt osv. tangentbordsgenvägar. Du kan också använda en snabbmeny i textområdet.

själv.scrollable_text_area = QTextEdit ()
vbox.addWidget (själv.rullbart_text_område)

Metoden “open_new_fie” kallas när en användare slutför tangentbordsgenväg. QFileDialog-klassen presenterar en filväljardialogruta för användaren. Filvägen bestäms efter att en användare har valt en fil från plockaren. Om filsökvägen är giltig läses textinnehåll från filen och ställs in på QTextEdit-widget. Detta gör texten synlig för användaren, ändrar titeln till det nya filnamnet och avslutar processen för att öppna en ny fil. Om filsökvägen av någon anledning inte kan bestämmas visas en "ogiltig fil" -varningsruta för användaren.

def open_new_file (själv):
själv.file_path, filter_type = QFileDialog.getOpenFileName (själv, "Öppna ny fil", "",
"Alla filer (*)")
om själv.sökväg:
med öppen (själv.file_path, "r") som f:
file_contents = f.läsa()
själv.titel.setText (själv.sökväg)
själv.rullningsbart_textområde.setText (filinnehåll)
annan:
själv.invalid_path_alert_message ()

Metoden “save_current_file” anropas när en användare slutför tangentbordsgenväg. Istället för att hämta en ny filsökväg ber QFileDialog nu användaren att tillhandahålla en sökväg. Om filsökvägen är giltig skrivs innehållet som syns i QTextEdit-widgeten till hela filvägen, annars visas en varningsruta för "ogiltig fil". Titeln på filen som för närvarande redigeras ändras också till den nya platsen som tillhandahålls av användaren.

def save_current_file (själv):
om inte själv.sökväg:
new_file_path, filter_type = QFileDialog.getSaveFileName (själv, "Spara den här filen
som ... "," "," Alla filer (*) ")
if new_file_path:
själv.file_path = new_file_path
annan:
själv.invalid_path_alert_message ()
återvänd Falskt
file_contents = själv.rullningsbart_textområde.toPlainText ()
med öppen (själv.file_path, "w") som f:
f.skriv (filinnehåll)
själv.titel.setText (själv.sökväg)

Metoden ”closeEvent” är en del av PyQt5 API för händelsehantering. Denna metod kallas när en användare försöker stänga ett fönster med korsknappen eller genom att trycka på tangentkombination. Vid avfyrning av stängningshändelsen visas användaren en dialogruta med tre val: “Ja”, “Nej” och “Avbryt”. “Ja” -knappen sparar filen och stänger applikationen medan knappen “Nej” stänger filen utan att spara innehållet. Knappen “Avbryt” stänger dialogrutan och tar användaren tillbaka till applikationen.

def closeEvent (själv, händelse):
messageBox = QMessageBox ()
title = "Avsluta ansökan?"
meddelande = "VARNING !!\ n \ nOm du slutar utan att spara kommer alla ändringar som gjorts i filen att göras
vara vilsen.\ n \ n Spara filen innan du slutar?"
svara = meddelandebox.fråga (själv, titel, meddelande, meddelandebox.Ja | meddelandebox.Nej |
meddelandebox.Avbryt, meddelandeBox.Avbryt)
om svar == meddelandeBox.Ja:
return_value = själv.save_current_file ()
if return_value == False:
händelse.strunta i()
elif svar == meddelandeBox.Nej:
händelse.acceptera()
annan:
händelse.strunta i()

Varningsrutan "Ogiltig fil" har inga klockor och visselpipor. Det förmedlar bara meddelandet att filvägen inte kunde bestämmas.

def invalid_path_alert_message (själv):
messageBox = QMessageBox ()
meddelandebox.setWindowTitle ("Ogiltig fil")
meddelandebox.setText ("Valt filnamn eller sökväg är inte giltigt. Välj en giltig fil.")
meddelandebox.exec ()

Slutligen startas den huvudsakliga applikationsslingan för händelsehantering och ritning av widgets med hjälp av ".exec_ () ”-metod.

om __name__ == '__main__':
app = QApplication (sys.argv)
w = Fönster ()
w.visaMaximerad ()
sys.exit (app.exec_ ())

Köra appen

Spara bara hela koden i en textfil, ställ in filtillägget till “.py ”, markera filen körbar och kör den för att starta appen. Till exempel om filnamnet är “simple_text_editor.py ”, måste du köra efter två kommandon:

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

Saker du kan göra för att förbättra koden

Koden som förklaras ovan fungerar bra för en textredigerare med bara ben. Det kan dock inte vara användbart för praktiska ändamål, eftersom det saknar många funktioner som ofta ses i bra textredigerare. Du kan förbättra koden genom att lägga till nya funktioner som radnummer, radmarkering, syntaxmarkering, flera flikar, sessionsbesparing, verktygsfält, rullgardinsmenyer, buffertändringsdetektering etc.

Slutsats

Den här artikeln fokuserar främst på att tillhandahålla en utgångspunkt för att skapa PyQt-appar. Om du hittar fel i koden eller vill föreslå något är feedback välkommen.

Mus Topp 5 Ergonomiska datormusprodukter för Linux
Topp 5 Ergonomiska datormusprodukter för Linux
Ger långvarig datoranvändning smärta i handleden eller fingrarna? Lider du av styva leder och måste ständigt skaka hand? Känner du en brännande smärta...
Mus Så här ändrar du inställningar för mus och pekplatta med Xinput i Linux
Så här ändrar du inställningar för mus och pekplatta med Xinput i Linux
De flesta Linux-distributioner levereras med "libinput" -bibliotek som standard för att hantera inmatningshändelser i ett system. Den kan bearbeta inm...
Mus Omforma dina musknappar på olika sätt för olika program med X-Mouse Button Control
Omforma dina musknappar på olika sätt för olika program med X-Mouse Button Control
Kanske behöver du ett verktyg som kan göra att musens kontroll ändras med alla applikationer som du använder. Om så är fallet kan du prova en ansökan ...