So schreiben Sie einen einfachen Texteditor in PYQT5

So schreiben Sie einen einfachen Texteditor in PYQT5
In diesem Artikel wird eine Anleitung zum Erstellen eines einfachen Texteditors in Python3 und PyQT5 behandelt. QT5 ist ein Satz plattformübergreifender Bibliotheken, die in C ++ geschrieben wurden und hauptsächlich zum Erstellen von reichhaltigen grafischen Anwendungen verwendet werden. PYQT5 bietet Python -Bindungen für die neueste Version von QT5. Alle Codeproben in diesem Artikel werden mit Python 3 getestet.8.2 und pyqt5 Version 5.14.1 auf Ubuntu 20.04.

Installieren von PYQT5 unter Linux

Um PYQT5 in der neuesten Version von Ubuntu zu installieren, führen Sie den folgenden Befehl aus:

$ sudo APT Installieren Sie Python3-Pyqt5

Wenn Sie eine andere Linux -Verteilung verwenden, suchen Sie im Paketmanager nach dem Begriff „PYQT5“ und installieren Sie ihn von dort aus. Alternativ können Sie PYQT5 vom PIP -Paketmanager mit dem folgenden Befehl installieren:

$ pip Installieren Sie PYQT5

Beachten Sie, dass Sie in einigen Verteilungen möglicherweise den PIP3 -Befehl verwenden müssen, um PYQT5 korrekt zu installieren.

Voller Code

Ich poste vorher einen vollständigen Code, damit Sie den Kontext für einzelne Code -Snippets besser verstehen können, die später im Artikel erläutert wurden. Wenn Sie mit Python und PYQT5 vertraut sind, können Sie sich einfach auf den folgenden Code verweisen und die Erklärung überspringen.

#!/usr/bin/env python3
Importsystem
von pyqt5.Qtwidgets importieren Qwidget, Qapplication, QvboxLayout, QHBoxLayout
von pyqt5.Qtwidgets importieren Qtextedit, Qlabel, Qshortcut, QFiledialog, QMessageBox
von pyqt5.Qtgui import qkeysequence
von pyqt5 import qt
Klassenfenster (Qwidget):
def __init __ (selbst):
super().__drin__()
selbst.Datei_path = Keine
selbst.open_new_file_shortcut = qshortcut (qKeySequence ('Strg+o'), Selbst)
selbst.open_new_file_shortcut.aktiviert.verbinden (Selbst.open_new_file)
selbst.SAVE_CURRENT_FILE_SHORTCUT = QSHORTCUT (qKeySequence ('Strg+S'), Selbst), Selbst)
selbst.SAVE_CURRENT_FILE_SHORTCUT.aktiviert.verbinden (Selbst.save_current_file)
vbox = qvboxLayout ()
text = "Untitled Datei"
selbst.Titel = Qlabel (Text)
selbst.Titel.setwordWrap (true)
selbst.Titel.setAnignment (qt.Qt.Im Zentrum anordnen)
Vbox.AddWidget (Selbst.Titel)
selbst.setLayout (Vbox)
selbst.scrollable_text_area = qtextedit ()
Vbox.AddWidget (Selbst.scrollable_text_area)
Def open_new_file (self):
selbst.Datei_Path, filter_type = qFiledialog.GetopenFileName (Selbst, "neue Datei öffnen",
"", "Alle Dateien (*)")
Wenn Selbst.Dateipfad:
mit offenem (Selbst.Datei_Path, "R") als f:
Datei_Contents = f.lesen()
selbst.Titel.setText (self.Dateipfad)
selbst.scrollable_text_area.setText (Datei_Contents)
anders:
selbst.Invaly_path_alert_message ()
Def Save_Current_file (Selbst):
wenn nicht selbst.Dateipfad:
new_file_path, filter_type = qFiledialog.getavefilename (self ", speichern Sie diese Datei
als ... "," "," alle Dateien (*) ")
If New_File_Path:
selbst.Datei_path = new_file_path
anders:
selbst.Invaly_path_alert_message ()
falsch zurückgeben
Datei_Contents = self.scrollable_text_area.toplainText ()
mit offenem (Selbst.Datei_Path, "w") als f:
F.Schreiben (Datei_Contents)
selbst.Titel.setText (self.Dateipfad)
Def CloseEvent (Selbst, Ereignis):
MessageBox = QMessageBox ()
title = "Anwendung beenden?"
Message = "Warnung !!\ n \ nif, dass Sie ohne Speichern kündigen, alle Änderungen an der Datei
wird verloren sein.\ n \ nSave -Datei vor dem Beenden?"
Antwort = MessageBox.Frage (Selbst, Titel, Nachricht, MessageBox.Ja | Nachrichtenbox.Nein |
Nachrichtenbox.Abbrechen, MessageBox.Stornieren)
Wenn Antwort == MessageBox.Ja:
return_value = self.save_current_file ()
Wenn return_value == false:
Fall.ignorieren()
Elif Reply == MessageBox.NEIN:
Fall.akzeptieren()
anders:
Fall.ignorieren()
Def Invalid_path_alert_message (Selbst):
MessageBox = QMessageBox ()
Nachrichtenbox.setWindowtitle ("Ungültige Datei")
Nachrichtenbox.setText ("ausgewählter Dateiname oder Pfad ist nicht gültig. Bitte wählen Sie a
Gültige Datei."))
Nachrichtenbox.exec ()
Wenn __name__ == '__main__':
app = qapplication (sys.argv)
W = Fenster ()
w.showmaximized ()
sys.beenden (App.exec_ ())

Erläuterung

Der erste Teil des Codes importiert nur Module, die im gesamten Beispiel verwendet werden:

Importsystem
von pyqt5.Qtwidgets importieren Qwidget, Qapplication, QvboxLayout, QHBoxLayout
von pyqt5.Qtwidgets importieren Qtextedit, Qlabel, Qshortcut, QFiledialog, QMessageBox
von pyqt5.Qtgui import qkeysequence
von pyqt5 import qt

Im nächsten Teil wird eine neue Klasse namens "Fenster" erstellt, die die "Qwidget" -Klasse erbt. QWIDGE -Klasse bietet häufig verwendete grafische Komponenten in QT. Durch die Verwendung von „Super“ können Sie sicherstellen, dass das übergeordnete QT -Objekt zurückgegeben wird.

Klassenfenster (Qwidget):
def __init __ (selbst):
super().__drin__()

Einige Variablen sind im nächsten Teil definiert. Der Dateipfad wird standardmäßig auf "None" gesetzt, und Verknüpfungen zum Öffnen einer Datei mithilfe und Speichern einer Datei werden mithilfe der Qshortcut -Klasse definiert. Diese Verknüpfungen werden dann mit ihren jeweiligen Methoden verbunden, die aufgerufen werden, wenn ein Benutzer die definierten Schlüsselkombinationen drückt.

selbst.Datei_path = Keine
selbst.open_new_file_shortcut = qshortcut (qKeySequence ('Strg+o'), Selbst)
selbst.open_new_file_shortcut.aktiviert.verbinden (Selbst.open_new_file)
selbst.SAVE_CURRENT_FILE_SHORTCUT = QSHORTCUT (qKeySequence ('Strg+S'), Selbst), Selbst)
selbst.SAVE_CURRENT_FILE_SHORTCUT.aktiviert.verbinden (Selbst.save_current_file)

Verwenden der QVBoxLayout -Klasse wird ein neues Layout erstellt, zu dem untergeordnete Widgets hinzugefügt werden. Eine mittelgroße Etikett wird für den Standarddateinamen mit der QLabel-Klasse festgelegt.

vbox = qvboxLayout ()
text = "Untitled Datei"
selbst.Titel = Qlabel (Text)
selbst.Titel.setwordWrap (true)
selbst.Titel.setAnignment (qt.Qt.Im Zentrum anordnen)
Vbox.AddWidget (Selbst.Titel)
selbst.setLayout (Vbox)

Als nächstes wird dem Layout ein Textbereich mit einem Qtextextextextex -Objekt hinzugefügt. Das QTExtedit -Widget bietet Ihnen einen bearbeitbaren, scrollbaren Bereich, mit dem Sie arbeiten können. Dieses Widget unterstützt typische Kopie, Einfügen, Schneiden, Rückgut, Wiederherstellung, Select-All usw. Tastatürkürzel. Sie können im Textbereich auch ein Menü mit der rechten Maustaste verwenden.

selbst.scrollable_text_area = qtextedit ()
Vbox.AddWidget (Selbst.scrollable_text_area)

Die Methode "open_new_fie" wird aufgerufen, wenn ein Benutzer eine Tastaturverknüpfung abschließt. QFiledialog -Klasse präsentiert dem Benutzer einen Datei -Picker -Dialog. Der Dateipfad wird ermittelt, nachdem ein Benutzer eine Datei aus der Auswahl ausgewählt hat. Wenn der Dateipfad gültig ist, wird der Textinhalt aus der Datei gelesen und auf QTExtedit -Widget gesetzt. Dies macht Text für den Benutzer sichtbar, ändert den Titel in den neuen Dateinamen und vervollständigt den Prozess der Öffnung einer neuen Datei. Wenn der Dateipfad aus irgendeinem Grund nicht ermittelt werden kann, wird dem Benutzer ein "ungültiges Datei -Warnfeld" angezeigt.

Def open_new_file (self):
selbst.Datei_Path, filter_type = qFiledialog.getopenFileName (self, "neue Datei öffnen", "",
"Alle Dateien (*)")
Wenn Selbst.Dateipfad:
mit offenem (Selbst.Datei_Path, "R") als f:
Datei_Contents = f.lesen()
selbst.Titel.setText (self.Dateipfad)
selbst.scrollable_text_area.setText (Datei_Contents)
anders:
selbst.Invaly_path_alert_message ()

Die Methode "SAVE_CURRENT_FILE" wird aufgerufen, wenn ein Benutzer Tastaturverknüpfung abschließt. Anstatt einen neuen Dateipfad abzurufen, fordert QFiledialog nun den Benutzer auf, einen Pfad anzugeben. Wenn der Dateipfad gültig ist, werden die in QTExtedit -Widget sichtbaren Inhalte in den vollständigen Dateipfad geschrieben, andernfalls wird ein "ungültiges Datei" -Alert -Feld angezeigt. Der Titel der derzeit bearbeiteten Datei wird ebenfalls in den neuen Standort des Benutzers geändert.

Def Save_Current_file (Selbst):
wenn nicht selbst.Dateipfad:
new_file_path, filter_type = qFiledialog.getavefilename (self ", speichern Sie diese Datei
als ... "," "," alle Dateien (*) ")
If New_File_Path:
selbst.Datei_path = new_file_path
anders:
selbst.Invaly_path_alert_message ()
falsch zurückgeben
Datei_Contents = self.scrollable_text_area.toplainText ()
mit offenem (Selbst.Datei_Path, "w") als f:
F.Schreiben (Datei_Contents)
selbst.Titel.setText (self.Dateipfad)

Die Methode „CloseEvent“ ist Teil der PYQT5 -Ereignisbearbeitungs -API. Diese Methode wird aufgerufen, wenn ein Benutzer versucht, ein Fenster mit der Cross -Taste zu schließen oder durch Drücken der Schlüsselkombination zu schließen. Bei der Entlassung des Schließenereignisses wird dem Benutzer ein Dialogfeld mit drei Auswahlmöglichkeiten angezeigt: "Ja", "Nein" und "Abbrechen". Die Schaltfläche "Ja" speichert die Datei und schließt die Anwendung, während die Schaltfläche "Nein" die Datei schließt, ohne den Inhalt zu speichern. Die Schaltfläche "Abbrechen" wird das Dialogfeld geschlossen und führt den Benutzer zur Anwendung zurück.

Def CloseEvent (Selbst, Ereignis):
MessageBox = QMessageBox ()
title = "Anwendung beenden?"
Message = "Warnung !!\ n \ nif, das Sie ohne Speichern beenden, werden alle Änderungen an der Datei vorgenommen
verloren sein.\ n \ nSave -Datei vor dem Beenden?"
Antwort = MessageBox.Frage (Selbst, Titel, Nachricht, MessageBox.Ja | Nachrichtenbox.Nein |
Nachrichtenbox.Abbrechen, MessageBox.Stornieren)
Wenn Antwort == MessageBox.Ja:
return_value = self.save_current_file ()
Wenn return_value == false:
Fall.ignorieren()
Elif Reply == MessageBox.NEIN:
Fall.akzeptieren()
anders:
Fall.ignorieren()

Die "ungültige Datei" -Alertbox hat keine Schnickschnack. Es vermittelt nur die Nachricht, dass der Dateipfad nicht bestimmt werden konnte.

Def Invalid_path_alert_message (Selbst):
MessageBox = QMessageBox ()
Nachrichtenbox.setWindowtitle ("Ungültige Datei")
Nachrichtenbox.setText ("ausgewählter Dateiname oder Pfad ist nicht gültig. Bitte wählen Sie eine gültige Datei aus."))
Nachrichtenbox.exec ()

Zuletzt wird die Hauptantragsschleife für die Ereignisbearbeitung und das Zeichnen von Widgets mit der “gestartet.exec_ () ”Methode.

Wenn __name__ == '__main__':
app = qapplication (sys.argv)
W = Fenster ()
w.showmaximized ()
sys.beenden (App.exec_ ())

Ausführen der App

Speichern Sie einfach den vollständigen Code in einer Textdatei. Setzen Sie die Dateierweiterung auf “, auf“.py ”, markieren Sie die ausführbare Datei und führen Sie sie aus, um die App zu starten. Zum Beispiel, wenn der Dateiname "Simple_text_editor lautet.Py “, Sie müssen die folgenden zwei Befehle ausführen:

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

Dinge, die Sie tun können, um den Code zu verbessern

Der oben erläuterte Code funktioniert gut für einen Texteditor mit nackten Beinen. Es ist jedoch möglicherweise nicht nützlich für praktische Zwecke, da es viele Funktionen fehlen. Sie können den Code verbessern, indem Sie neue Funktionen wie Zeilennummern, Zeilen -Hervorhebung, Syntax -Hervorhebung, mehrere Registerkarten, Sitzungssparen, Symbolleiste, Dropdown -Menüs, Pufferänderungserkennung usw. hinzufügen.

Abschluss

Dieser Artikel konzentriert sich hauptsächlich auf die Bereitstellung eines Startgeländes für das Erstellen von PYQT -Apps. Wenn Sie Fehler im Code finden oder etwas vorschlagen möchten, ist Feedback willkommen.