Python

Ako napísať jednoduchý textový editor v PyQt5

Ako napísať jednoduchý textový editor v PyQt5
Tento článok sa bude venovať sprievodcovi vytvorením jednoduchého textového editora v programoch Python3 a PyQt5. Qt5 je sada multiplatformných knižníc napísaných v C ++, ktorá sa používa hlavne na vytváranie bohatých grafických aplikácií. PyQt5 poskytuje väzby Pythonu pre najnovšiu verziu Qt5. Všetky ukážky kódu v tomto článku sú testované s programom Python 3.8.2 a PyQt5 verzie 5.14.1 na Ubuntu 20.04.

Inštalácia PyQt5 v systéme Linux

Ak chcete nainštalovať PyQt5 v najnovšej verzii Ubuntu, spustite nasledujúci príkaz:

$ sudo apt nainštalovať python3-pyqt5

Ak používate inú distribúciu Linuxu, vyhľadajte v správcovi balíkov výraz „Pyqt5“ a odtiaľ ho nainštalujte. Prípadne môžete nainštalovať PyQt5 zo správcu balíkov pip pomocou nasledujúceho príkazu:

$ pip nainštalovať pyqt5

Upozorňujeme, že v niektorých distribúciách možno budete musieť na správnu inštaláciu PyQt5 použiť príkaz pip3.

Celý kód

Predtým uverejňujem celý kód, aby ste lepšie pochopili kontext pre jednotlivé úryvky kódu vysvetlené ďalej v článku. Ak poznáte Python a PyQt5, stačí sa obrátiť na nasledujúci kód a preskočiť vysvetlenie.

#!/ usr / bin / env python3
import sys
z PyQt5.QtWidgets importujú QWidget, QApplication, QVBoxLayout, QHBoxLayout
z PyQt5.QtWidgets importujú QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
z PyQt5.QtGui importuje QKeySequence
z PyQt5 import Qt
okno triedy (QWidget):
def __init __ (self):
Super().__init __ ()
ja.file_path = Žiadne
ja.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), vlastné)
ja.open_new_file_shortcut.aktivovaný.spojiť (seba.open_new_file)
ja.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), vlastné)
ja.save_current_file_shortcut.aktivovaný.spojiť (seba.save_current_file)
vbox = QVBoxLayout ()
text = "Súbor bez názvu"
ja.názov = QLabel (text)
ja.titul.setWordWrap (True)
ja.titul.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (vlastné.názov)
ja.setLayout (vbox)
ja.scrollable_text_area = QTextEdit ()
vbox.addWidget (vlastné.scrollable_text_area)
def open_new_file (self):
ja.cesta_souboru, filter_type = QFileDialog.getOpenFileName (self, "Otvoriť nový súbor"),
"", "Všetky súbory (*)")
ak ja.cesta k súboru:
s otvoreným (vlastným.cesta_souboru, "r") ako f:
file_contents = f.čítať()
ja.titul.setText (vlastné.cesta k súboru)
ja.scrollable_text_area.setText (obsah_súboru)
inak:
ja.invalid_path_alert_message ()
def save_current_file (self):
ak nie ja.cesta k súboru:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Uložiť tento súbor."
ako ... "," "," Všetky súbory (*) ")
ak new_file_path:
ja.cesta k_súboru = cesta k novému_súboru
inak:
ja.invalid_path_alert_message ()
návrat False
file_contents = self.scrollable_text_area.toPlainText ()
s otvoreným (vlastným.cesta_souboru, "w") ako f:
f.write (file_contents)
ja.titul.setText (vlastné.cesta k súboru)
def closeEvent (seba, udalosť):
messageBox = QMessageBox ()
title = "Ukončiť aplikáciu?„
message = "VAROVANIE !!\ n \ nAk ukončíte program bez uloženia, vykonajú sa akékoľvek zmeny v súbore
bude stratený.\ n \ nPred ukončením uložte súbor?„
reply = messageBox.otázka (ja, titul, správa, messageBox.Áno | messageBox.Nie |
messageBox.Zrušiť, messageBox.Zrušiť)
ak odpoveď == messageBox.Áno:
return_value = self.save_current_file ()
if return_value == False:
udalosť.ignorovať()
elif odpoveď == messageBox.Č
udalosť.súhlasiť()
inak:
udalosť.ignorovať()
def invalid_path_alert_message (self):
messageBox = QMessageBox ()
messageBox.setWindowTitle ("Neplatný súbor")
messageBox.setText ("Vybratý názov súboru alebo cesta nie je platný. Vyberte a
platný súbor.„)
messageBox.exec ()
ak __name__ == '__main__':
app = QApplication (sys.argv)
w = okno ()
w.showMaximized ()
sys.výstup (app.exec_ ())

Vysvetlenie

Prvá časť kódu iba importuje moduly, ktoré sa použijú v celej vzorke:

import sys
z PyQt5.QtWidgets importujú QWidget, QApplication, QVBoxLayout, QHBoxLayout
z PyQt5.QtWidgets importujú QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
z PyQt5.QtGui importuje QKeySequence
z PyQt5 import Qt

V nasledujúcej časti je vytvorená nová trieda s názvom „Okno“, ktorá dedí z triedy „QWidget“. Trieda QWidget poskytuje bežne používané grafické komponenty v Qt. Použitím výrazu „super“ môžete zabezpečiť, aby sa vrátil rodičovský objekt Qt.

okno triedy (QWidget):
def __init __ (self):
Super().__init __ ()

Niektoré premenné sú definované v nasledujúcej časti. Cesta k súboru je predvolene nastavená na „Žiadna“ a skratky pre otvorenie súboru pomocou a uloženie súboru pomocou sú definované pomocou triedy QShortcut. Tieto skratky sú potom spojené s príslušnými metódami, ktoré sa volajú vždy, keď používateľ stlačí definované kombinácie klávesov.

ja.file_path = Žiadne
ja.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), vlastné)
ja.open_new_file_shortcut.aktivovaný.spojiť (seba.open_new_file)
ja.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), vlastné)
ja.save_current_file_shortcut.aktivovaný.spojiť (seba.save_current_file)

Pomocou triedy QVBoxLayout sa vytvorí nové rozloženie, do ktorého sa pridajú podradené widgety. Pre predvolený názov súboru je pomocou triedy QLabel nastavený štítok zarovnaný na stred.

vbox = QVBoxLayout ()
text = "Súbor bez názvu"
ja.názov = QLabel (text)
ja.titul.setWordWrap (True)
ja.titul.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (vlastné.názov)
ja.setLayout (vbox)

Ďalej sa do rozloženia pridá textová oblasť pomocou objektu QTextEdit. Widget QTextEdit vám poskytne upraviteľnú a posúvateľnú oblasť, s ktorou môžete pracovať. Tento widget podporuje typické kopírovanie, vkladanie, vystrihovanie, vrátenie, opakovanie, výber všetkých atď. klávesové skratky. Môžete tiež použiť kontextové menu pravým tlačidlom myši v textovej oblasti.

ja.scrollable_text_area = QTextEdit ()
vbox.addWidget (vlastné.scrollable_text_area)

Metóda „open_new_fie“ sa volá, keď používateľ dokončí prácu klávesová skratka. Trieda QFileDialog predstavuje používateľovi dialógové okno na výber súborov. Cesta k súboru sa určí potom, čo používateľ vyberie súbor z výberu. Ak je cesta k súboru platná, textový obsah sa načíta zo súboru a nastaví sa na widget QTextEdit. Toto zviditeľní text pre používateľa, zmení názov na nový názov súboru a dokončí proces otvorenia nového súboru. Ak z nejakého dôvodu nemožno určiť cestu k súboru, používateľovi sa zobrazí výstražné okno „neplatný súbor“.

def open_new_file (self):
ja.cesta_souboru, filter_type = QFileDialog.getOpenFileName (self, "Otvoriť nový súbor", "",
"Všetky súbory (*)")
ak ja.cesta k súboru:
s otvoreným (vlastným.cesta_souboru, "r") ako f:
file_contents = f.čítať()
ja.titul.setText (vlastné.cesta k súboru)
ja.scrollable_text_area.setText (obsah_súboru)
inak:
ja.invalid_path_alert_message ()

Metóda „save_current_file“ sa volá vždy, keď používateľ dokončí prácu klávesová skratka. Namiesto získania novej cesty k súboru teraz QFileDialog požiada používateľa, aby zadal cestu. Ak je cesta k súboru platná, obsah viditeľný v miniaplikácii QTextEdit sa zapíše do celej cesty k súboru, inak sa zobrazí výstražné okno „neplatný súbor“. Názov súboru, ktorý sa práve upravuje, sa tiež zmení na nové umiestnenie, ktoré poskytne používateľ.

def save_current_file (self):
ak nie ja.cesta k súboru:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Uložiť tento súbor."
ako ... "," "," Všetky súbory (*) ")
ak new_file_path:
ja.cesta k_súboru = cesta k novému_súboru
inak:
ja.invalid_path_alert_message ()
návrat False
file_contents = self.scrollable_text_area.toPlainText ()
s otvoreným (vlastným.cesta_souboru, "w") ako f:
f.write (file_contents)
ja.titul.setText (vlastné.cesta k súboru)

Metóda „closeEvent“ je súčasťou API na spracovanie udalostí PyQt5. Táto metóda sa volá vždy, keď sa používateľ pokúsi zavrieť okno pomocou krížového tlačidla alebo úderu kombinácia klávesov. Pri spustení udalosti blízkej udalosti sa používateľovi zobrazí dialógové okno s tromi možnosťami: „Áno“, „Nie“ a „Zrušiť“. Tlačidlo „Áno“ uloží súbor a zatvorí aplikáciu, zatiaľ čo tlačidlo „Nie“ zatvorí súbor bez uloženia obsahu. Tlačidlo „Zrušiť“ zatvorí dialógové okno a vráti používateľa späť do aplikácie.

def closeEvent (seba, udalosť):
messageBox = QMessageBox ()
title = "Ukončiť aplikáciu?„
message = "UPOZORNENIE !!\ n \ nAk ukončíte program bez uloženia, vykonajú sa všetky zmeny vykonané v súbore
byť stratený.\ n \ nPred ukončením uložte súbor?„
reply = messageBox.otázka (ja, titul, správa, messageBox.Áno | messageBox.Nie |
messageBox.Zrušiť, messageBox.Zrušiť)
ak odpoveď == messageBox.Áno:
return_value = self.save_current_file ()
if return_value == False:
udalosť.ignorovať()
elif odpoveď == messageBox.Č
udalosť.súhlasiť()
inak:
udalosť.ignorovať()

Výstražné pole „Neplatný súbor“ nemá žiadne zvončeky a píšťalky. Poskytuje iba správu, že cestu k súboru nebolo možné určiť.

def invalid_path_alert_message (self):
messageBox = QMessageBox ()
messageBox.setWindowTitle ("Neplatný súbor")
messageBox.setText ("Vybratý názov súboru alebo cesta nie je platný. Vyberte platný súbor.„)
messageBox.exec ()

Nakoniec sa hlavná slučka aplikácie na spracovanie udalostí a kreslenie widgetov spustí pomocou znaku „.metóda exec_ () “.

ak __name__ == '__main__':
app = QApplication (sys.argv)
w = okno ()
w.showMaximized ()
sys.výstup (app.exec_ ())

Spustenie aplikácie

Stačí uložiť celý kód do textového súboru, nastaviť príponu súboru na „.py ”, označte súbor ako spustiteľný a spustite ho na spustenie aplikácie. Napríklad ak je názov súboru „simple_text_editor.py ”, musíte spustiť nasledujúce dva príkazy:

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

Čo môžete urobiť pre vylepšenie kódexu

Vyššie uvedený kód funguje dobre pre textový editor s holými kosťami. Z praktických dôvodov to však nemusí byť užitočné, pretože mu chýba veľa funkcií, ktoré sa bežne vyskytujú v dobrých textových editoroch. Kód môžete vylepšiť pridaním nových funkcií, ako sú čísla riadkov, zvýraznenie riadkov, zvýraznenie syntaxe, viac kariet, ukladanie relácií, panel s nástrojmi, rozbaľovacie ponuky, detekcia zmien vyrovnávacej pamäte atď.

Záver

Tento článok sa zameriava hlavne na poskytnutie východiska pre vytváranie aplikácií PyQt. Ak nájdete v kóde chyby alebo chcete niečo navrhnúť, spätná väzba je vítaná.

Hry Výukový program Shadow of the Tomb Raider pre Linux
Výukový program Shadow of the Tomb Raider pre Linux
Shadow of the Tomb Raider je dvanásty prírastok do série Tomb Raider - franšíza akčných adventúr vytvorená Eidosom Montrealom. Túto hru prijali kritic...
Hry Ako zvýšiť rýchlosť FPS v systéme Linux?
Ako zvýšiť rýchlosť FPS v systéme Linux?
FPS znamená Počet snímok za sekundu. Úlohou FPS je merať snímkovú frekvenciu pri prehrávaní videa alebo herných výkonoch. Jednoducho povedané, počet n...
Hry Najlepšie hry Oculus App Lab
Najlepšie hry Oculus App Lab
Ak ste vlastníkom náhlavnej súpravy Oculus, musíte byť informovaní o bočnom nakladaní. Sideloading je proces inštalácie neuloženého obsahu do náhlavne...