Piton

Cum se scrie un editor de text simplu în PyQt5

Cum se scrie un editor de text simplu în PyQt5
Acest articol va acoperi un ghid despre crearea unui editor de text simplu în Python3 și PyQt5. Qt5 este un set de biblioteci cross-platform scrise în C ++, utilizate în principal pentru crearea de aplicații grafice bogate. PyQt5 oferă legături Python pentru cea mai recentă versiune a Qt5. Toate mostrele de cod din acest articol sunt testate cu Python 3.8.2 și PyQt5 versiunea 5.14.1 pe Ubuntu 20.04.

Instalarea PyQt5 în Linux

Pentru a instala PyQt5 în cea mai recentă versiune de Ubuntu, rulați comanda de mai jos:

$ sudo apt install python3-pyqt5

Dacă utilizați orice altă distribuție Linux, căutați termenul „Pyqt5” în managerul de pachete și instalați-l de acolo. Alternativ, puteți instala PyQt5 din managerul de pachete pip utilizând comanda de mai jos:

$ pip instala pyqt5

Rețineți că în unele distribuții, poate fi necesar să utilizați comanda pip3 pentru a instala corect PyQt5.

Cod complet

Postez codul complet în prealabil, astfel încât să puteți înțelege mai bine contextul pentru fragmente de cod individuale explicate mai târziu în articol. Dacă sunteți familiarizați cu Python și PyQt5, puteți consulta codul de mai jos și săriți explicația.

#!/ usr / bin / env python3
import sisteme
din PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout
din PyQt5.QtWidgets import QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
din PyQt5.QtGui import QKeySequence
din PyQt5 import Qt
clasa Window (QWidget):
def __init __ (auto):
super().__init __ ()
de sine.file_path = Niciuna
de sine.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), auto)
de sine.open_new_file_shortcut.activat.conecta (auto.open_new_file)
de sine.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), auto)
de sine.save_current_file_shortcut.activat.conecta (auto.save_current_file)
vbox = QVBoxLayout ()
text = "Fișier fără titlu"
de sine.title = QLabel (text)
de sine.titlu.setWordWrap (True)
de sine.titlu.setAlignment (Qt.Qt.Aliniere la centru)
vbox.addWidget (auto.titlu)
de sine.setLayout (vbox)
de sine.scrollable_text_area = QTextEdit ()
vbox.addWidget (auto.scroll__text_area)
def open_new_file (self):
de sine.file_path, filter_type = QFileDialog.getOpenFileName (auto, „Deschideți fișierul nou”,
"", "Toate filele (*)")
dacă eul.file_path:
cu deschis (auto.file_path, "r") ca f:
file_contents = f.citit()
de sine.titlu.setText (auto.file_path)
de sine.scroll__text_area.setText (file_contents)
altceva:
de sine.invalid_path_alert_message ()
def save_current_file (self):
dacă nu de sine.file_path:
new_file_path, filter_type = QFileDialog.getSaveFileName (auto, "Salvați acest fișier
ca ... "," "," Toate fișierele (*) ")
dacă calea_fișierului_nou:
de sine.file_path = new_file_path
altceva:
de sine.invalid_path_alert_message ()
returnează Fals
file_contents = auto.scroll__text_area.toPlainText ()
cu deschis (auto.file_path, "w") ca f:
f.scrie (conținut_fișier)
de sine.titlu.setText (auto.file_path)
def closeEvent (auto, eveniment):
messageBox = QMessageBox ()
title = "Părăsiți aplicația?"
mesaj = "AVERTISMENT !!\ n \ n Dacă renunțați fără a salva, orice modificări aduse fișierului
va fi pierdut.\ n \ nSalvați fișierul înainte de a renunța?"
reply = messageBox.întrebare (auto, titlu, mesaj, messageBox.Da | messageBox.Nu |
messageBox.Anulați, messageBox.Anulare)
dacă răspunde == messageBox.Da:
return_value = auto.save_current_file ()
dacă return_value == False:
eveniment.ignora()
elif reply == messageBox.Nu:
eveniment.Accept()
altceva:
eveniment.ignora()
def invalid_path_alert_message (auto):
messageBox = QMessageBox ()
messageBox.setWindowTitle („Fișier nevalid”)
messageBox.setText („Numele de fișier selectat sau calea nu este validă. Vă rugăm să selectați un
fișier valid.")
messageBox.exec ()
dacă __name__ == '__main__':
app = QApplication (sys.argv)
w = Window ()
w.showMaximized ()
sys.ieșire (aplicație.exec_ ())

Explicaţie

Prima parte a codului importă doar module care vor fi utilizate pe tot eșantionul:

import sisteme
din PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout
din PyQt5.QtWidgets import QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
din PyQt5.QtGui import QKeySequence
din PyQt5 import Qt

În partea următoare, se creează o nouă clasă numită „Window” care moștenește din clasa „QWidget”. Clasa QWidget oferă componente grafice utilizate în mod obișnuit în Qt. Utilizând „super” vă puteți asigura că obiectul Qt părinte este returnat.

clasa Window (QWidget):
def __init __ (auto):
super().__init __ ()

Unele variabile sunt definite în partea următoare. Calea fișierului este setată la „Niciuna” în mod implicit și comenzi rapide pentru deschiderea unui fișier folosind și salvarea unui fișier folosind sunt definite folosind clasa QShortcut. Aceste comenzi rapide sunt apoi conectate la metodele lor respective, care sunt apelate ori de câte ori un utilizator apasă combinațiile de taste definite.

de sine.file_path = Niciuna
de sine.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), auto)
de sine.open_new_file_shortcut.activat.conecta (auto.open_new_file)
de sine.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), auto)
de sine.save_current_file_shortcut.activat.conecta (auto.save_current_file)

Folosind clasa QVBoxLayout, este creat un nou aspect la care vor fi adăugate widget-uri copil. O etichetă aliniată la centru este setată pentru numele de fișier implicit folosind clasa QLabel.

vbox = QVBoxLayout ()
text = "Fișier fără titlu"
de sine.title = QLabel (text)
de sine.titlu.setWordWrap (True)
de sine.titlu.setAlignment (Qt.Qt.Aliniere la centru)
vbox.addWidget (auto.titlu)
de sine.setLayout (vbox)

Apoi, o zonă de text este adăugată la aspect folosind un obiect QTextEdit. Widgetul QTextEdit vă va oferi o zonă editabilă, derulabilă, cu care să lucrați. Acest widget acceptă copierea, lipirea, tăierea, anularea, refacerea, selectarea tuturor etc. comenzi rapide de la tastatură. De asemenea, puteți utiliza un meniu contextual cu clic dreapta în zona de text.

de sine.scrollable_text_area = QTextEdit ()
vbox.addWidget (auto.scroll__text_area)

Metoda „open_new_fie” este apelată atunci când un utilizator finalizează Comanda rapidă de la tastatură. Clasa QFileDialog prezintă utilizatorului un dialog de selectare a fișierelor. Calea fișierului este determinată după ce un utilizator selectează un fișier din selector. Dacă calea fișierului este validă, conținutul textului este citit din fișier și setat la widgetul QTextEdit. Acest lucru face ca textul să fie vizibil pentru utilizator, schimbă titlul cu noul nume de fișier și finalizează procesul de deschidere a unui fișier nou. Dacă dintr-un anumit motiv, calea fișierului nu poate fi determinată, o casetă de alertă „fișier nevalid” este afișată utilizatorului.

def open_new_file (self):
de sine.file_path, filter_type = QFileDialog.getOpenFileName (auto, "Deschideți fișierul nou", "",
"Toate filele (*)")
dacă eul.file_path:
cu deschis (auto.file_path, "r") ca f:
file_contents = f.citit()
de sine.titlu.setText (auto.file_path)
de sine.scroll__text_area.setText (file_contents)
altceva:
de sine.invalid_path_alert_message ()

Metoda „save_current_file” este apelată de fiecare dată când un utilizator finalizează Comanda rapidă de la tastatură. În loc să recupereze o nouă cale de fișier, QFileDialog cere acum utilizatorului să furnizeze o cale. Dacă calea fișierului este validă, conținutul vizibil în widgetul QTextEdit este scris pe calea completă a fișierului, altfel este afișată o casetă de alertă „fișier nevalid”. Titlul fișierului în curs de editare este, de asemenea, schimbat în noua locație furnizată de utilizator.

def save_current_file (self):
dacă nu de sine.file_path:
new_file_path, filter_type = QFileDialog.getSaveFileName (auto, "Salvați acest fișier
ca ... "," "," Toate fișierele (*) ")
dacă calea_fișierului_nou:
de sine.file_path = new_file_path
altceva:
de sine.invalid_path_alert_message ()
returnează Fals
file_contents = auto.scroll__text_area.toPlainText ()
cu deschis (auto.file_path, "w") ca f:
f.scrie (conținut_fișier)
de sine.titlu.setText (auto.file_path)

Metoda „closeEvent” face parte din API-ul de gestionare a evenimentelor PyQt5. Această metodă este apelată ori de câte ori un utilizator încearcă să închidă o fereastră folosind butonul încrucișat sau lovind combinație de taste. La declanșarea evenimentului de închidere, utilizatorului i se afișează o casetă de dialog cu trei opțiuni: „Da”, „Nu” și „Anulare”. Butonul „Da” salvează fișierul și închide aplicația, în timp ce butonul „Nu” închide fișierul fără a salva conținutul. Butonul „Anulare” închide caseta de dialog și readuce utilizatorul la aplicație.

def closeEvent (auto, eveniment):
messageBox = QMessageBox ()
title = "Părăsiți aplicația?"
mesaj = "AVERTISMENT !!\ n \ n Dacă renunțați fără a salva, orice modificare adusă fișierului va fi
a fi pierdut.\ n \ nSalvați fișierul înainte de a renunța?"
reply = messageBox.întrebare (auto, titlu, mesaj, messageBox.Da | messageBox.Nu |
messageBox.Anulați, messageBox.Anulare)
dacă răspunde == messageBox.Da:
return_value = auto.save_current_file ()
dacă return_value == False:
eveniment.ignora()
răspuns elif == messageBox.Nu:
eveniment.Accept()
altceva:
eveniment.ignora()

Caseta de avertizare „fișier nevalid” nu are clopote și fluiere. Pur și simplu transmite mesajul că calea fișierului nu a putut fi determinată.

def invalid_path_alert_message (auto):
messageBox = QMessageBox ()
messageBox.setWindowTitle („Fișier nevalid”)
messageBox.setText („Numele de fișier selectat sau calea nu este validă. Vă rugăm să selectați un fișier valid.")
messageBox.exec ()

În sfârșit, bucla principală a aplicației pentru gestionarea evenimentelor și desenarea widgeturilor este pornită folosind „.metoda exec_ () ”.

dacă __name__ == '__main__':
app = QApplication (sys.argv)
w = Window ()
w.showMaximized ()
sys.ieșire (aplicație.exec_ ())

Rularea aplicației

Salvați doar codul complet într-un fișier text, setați extensia de fișier la „.py ”, marcați fișierul executabil și rulați-l pentru a lansa aplicația. De exemplu, dacă numele fișierului este „simplu_text_editor.py ”, trebuie să executați următoarele două comenzi:

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

Lucruri pe care le puteți face pentru a îmbunătăți codul

Codul explicat mai sus funcționează bine pentru un editor de text cu oase goale. Cu toate acestea, este posibil să nu fie util în scopuri practice, deoarece îi lipsesc multe caracteristici frecvent observate în editorii de text buni. Puteți îmbunătăți codul adăugând funcții noi, cum ar fi numerele de linie, evidențierea liniei, evidențierea sintaxei, mai multe file, salvarea sesiunii, bara de instrumente, meniurile derulante, detectarea modificării bufferului etc.

Concluzie

Acest articol se concentrează în principal pe oferirea unui teren de pornire pentru crearea aplicațiilor PyQt. Dacă găsiți erori în cod sau doriți să sugerați ceva, feedbackul este binevenit.

Instalați cel mai recent joc de strategie OpenRA pe Ubuntu Linux
OpenRA este un motor de jocuri de strategie în timp real Libre / Free care recreează primele jocuri Westwood, cum ar fi clasicul Command & Conquer: Re...
Instalați cel mai recent Dolphin Emulator pentru Gamecube și Wii pe Linux
Emulatorul Dolphin vă permite să jucați jocurile alese de Gamecube și Wii pe computerele personale Linux (PC). Fiind un emulator de joc liber disponi...
Cum se folosește GameConqueror Cheat Engine în Linux
Articolul acoperă un ghid despre utilizarea sistemului de înșelăciune GameConqueror în Linux. Mulți utilizatori care joacă jocuri pe Windows folosesc ...