Krajta

Jak napsat jednoduchý textový editor v PyQt5

Jak napsat jednoduchý textový editor v PyQt5
Tento článek se bude věnovat průvodce vytvořením jednoduchého textového editoru v Python3 a PyQt5. Qt5 je sada multiplatformních knihoven napsaných v C ++, která se používá hlavně k vytváření bohatých grafických aplikací. PyQt5 poskytuje vazby Pythonu pro nejnovější verzi Qt5. Všechny ukázky kódu v tomto článku jsou testovány pomocí Pythonu 3.8.2 a PyQt5 verze 5.14.1 na Ubuntu 20.04.

Instalace PyQt5 v Linuxu

Chcete-li nainstalovat PyQt5 v nejnovější verzi Ubuntu, spusťte následující příkaz:

$ sudo apt nainstalovat python3-pyqt5

Pokud používáte jinou distribuci Linuxu, vyhledejte ve správci balíčků výraz „Pyqt5“ a nainstalujte jej odtud. Alternativně můžete nainstalovat PyQt5 ze správce balíčků pip pomocí níže uvedeného příkazu:

$ pip nainstalovat pyqt5

Všimněte si, že v některých distribucích možná budete muset použít příkaz pip3 ke správné instalaci PyQt5.

Celý kód

Předtím zveřejňuji celý kód, abyste lépe porozuměli kontextu pro jednotlivé fragmenty kódu vysvětlené dále v článku. Pokud jste obeznámeni s Pythonem a PyQt5, můžete se jen podívat na níže uvedený kód a přeskočit vysvětlení.

#!/ 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 import QKeySequence
z PyQt5 import Qt
okno třídy (QWidget):
def __init __ (vlastní):
super ().__init __ ()
já.file_path = Žádný
já.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), vlastní)
já.open_new_file_shortcut.aktivován.připojit (já.open_new_file)
já.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), vlastní)
já.save_current_file_shortcut.aktivován.připojit (já.save_current_file)
vbox = QVBoxLayout ()
text = "Soubor bez názvu"
já.title = QLabel (text)
já.titul.setWordWrap (True)
já.titul.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (vlastní.titul)
já.setLayout (vbox)
já.scrollable_text_area = QTextEdit ()
vbox.addWidget (vlastní.scrollable_text_area)
def open_new_file (self):
já.file_path, filter_type = QFileDialog.getOpenFileName (vlastní, "Otevřít nový soubor",
"", "Všechny soubory (*)")
pokud já.cesta_souboru:
s otevřeným (já.cesta_souboru, "r") jako f:
file_contents = f.číst()
já.titul.setText (vlastní.cesta_souboru
já.scrollable_text_area.setText (soubor_obsah)
jiný:
já.invalid_path_alert_message ()
def save_current_file (self):
pokud ne já.cesta_souboru:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Uložit tento soubor
jako ... "," "," Všechny soubory (*) ")
pokud new_file_path:
já.cesta_souboru = cesta_na_soubor_souboru
jiný:
já.invalid_path_alert_message ()
vrátit False
file_contents = self.scrollable_text_area.toPlainText ()
s otevřeným (já.cesta_souboru, "w") jako f:
F.write (soubor_obsah)
já.titul.setText (vlastní.cesta_souboru
def closeEvent (self, event):
messageBox = QMessageBox ()
title = "Ukončit aplikaci?"
message = "VAROVÁNÍ !!\ n \ nPokud ukončíte práci bez uložení, provedou se všechny změny v souboru
bude ztraceno.\ n \ nUložte soubor před ukončením?"
odpověď = messageBox.otázka (já, titul, zpráva, messageBox.Ano | messageBox.Ne |
messageBox.Zrušit, messageBox.Zrušení)
pokud odpověď == messageBox.Ano:
return_value = self.save_current_file ()
if return_value == False:
událost.ignorovat()
elif odpověď == messageBox.Ne:
událost.akceptovat()
jiný:
událost.ignorovat()
def invalid_path_alert_message (self):
messageBox = QMessageBox ()
messageBox.setWindowTitle ("Neplatný soubor")
messageBox.setText ("Vybraný název souboru nebo cesta není platný. Vyberte a
platný soubor.")
messageBox.exec ()
pokud __name__ == '__main__':
aplikace = QApplication (sys.argv)
w = okno ()
w.showMaximized ()
sys.výstup (app.exec_ ())

Vysvětlení

První část kódu pouze importuje moduly, které budou použity v celém vzorku:

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 další části je vytvořena nová třída s názvem „Okno“, která dědí z třídy „QWidget“. Třída QWidget poskytuje běžně používané grafické komponenty v Qt. Použitím „super“ můžete zajistit, aby byl vrácen nadřazený objekt Qt.

okno třídy (QWidget):
def __init __ (vlastní):
super ().__init __ ()

Některé proměnné jsou definovány v další části. Cesta k souboru je ve výchozím nastavení nastavena na „Žádná“ a zástupci pro otevření souboru pomocí a uložení souboru pomocí jsou definovány pomocí třídy QShortcut. Tyto klávesové zkratky jsou poté připojeny k jejich příslušným metodám, které jsou volány vždy, když uživatel stiskne definované kombinace kláves.

já.file_path = Žádný
já.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), vlastní)
já.open_new_file_shortcut.aktivován.připojit (já.open_new_file)
já.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), vlastní)
já.save_current_file_shortcut.aktivován.připojit (já.save_current_file)

Pomocí třídy QVBoxLayout je vytvořeno nové rozložení, do kterého budou přidány podřízené widgety. Štítek zarovnaný na střed je nastaven pro výchozí název souboru pomocí třídy QLabel.

vbox = QVBoxLayout ()
text = "Soubor bez názvu"
já.title = QLabel (text)
já.titul.setWordWrap (True)
já.titul.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (vlastní.titul)
já.setLayout (vbox)

Dále je do rozložení přidána textová oblast pomocí objektu QTextEdit. Widget QTextEdit vám poskytne upravitelnou rolovací oblast, se kterou můžete pracovat. Tento widget podporuje typické kopírování, vkládání, vyjímání, zpět, opakování, výběr všeho atd. klávesové zkratky. Můžete také použít místní nabídku pravým tlačítkem myši v textové oblasti.

já.scrollable_text_area = QTextEdit ()
vbox.addWidget (vlastní.scrollable_text_area)

Metoda „open_new_fie“ se volá, když uživatel dokončí práci klávesová zkratka. Třída QFileDialog představuje uživateli dialog pro výběr souboru. Cesta k souboru je určena poté, co uživatel vybere soubor z výběru. Pokud je cesta k souboru platná, textový obsah se načte ze souboru a nastaví se na widget QTextEdit. To zviditelní text pro uživatele, změní název na nový název souboru a dokončí proces otevírání nového souboru. Pokud z nějakého důvodu nelze určit cestu k souboru, uživateli se zobrazí výstražné pole „neplatný soubor“.

def open_new_file (self):
já.file_path, filter_type = QFileDialog.getOpenFileName (vlastní, "Otevřít nový soubor", "",
"Všechny soubory (*)")
pokud já.cesta_souboru:
s otevřeným (já.cesta_souboru, "r") jako f:
file_contents = f.číst()
já.titul.setText (vlastní.cesta_souboru
já.scrollable_text_area.setText (soubor_obsah)
jiný:
já.invalid_path_alert_message ()

Metoda „save_current_file“ je volána, kdykoli uživatel dokončí klávesová zkratka. Místo načítání nové cesty k souboru nyní QFileDialog požádá uživatele, aby zadal cestu. Pokud je cesta k souboru platná, obsah viditelný v widgetu QTextEdit se zapíše do celé cesty k souboru, jinak se zobrazí výstražné pole „neplatný soubor“. Název aktuálně upravovaného souboru se také změní na nové umístění poskytnuté uživatelem.

def save_current_file (self):
pokud ne já.cesta_souboru:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Uložit tento soubor
jako ... "," "," Všechny soubory (*) ")
pokud new_file_path:
já.cesta_souboru = cesta_na_soubor_souboru
jiný:
já.invalid_path_alert_message ()
vrátit False
file_contents = self.scrollable_text_area.toPlainText ()
s otevřeným (já.cesta_souboru, "w") jako f:
F.write (soubor_obsah)
já.titul.setText (vlastní.cesta_souboru

Metoda „closeEvent“ je součástí rozhraní API pro zpracování událostí PyQt5. Tato metoda je volána, kdykoli se uživatel pokusí zavřít okno pomocí křížového tlačítka nebo stisknutím klávesy kombinace kláves. Při spuštění události close se uživateli zobrazí dialogové okno se třemi možnostmi: „Yes“, „No“ a „Cancel“. Tlačítko „Ano“ uloží soubor a zavře aplikaci, zatímco tlačítko „Ne“ zavře soubor bez uložení obsahu. Tlačítko „Storno“ zavírá dialogové okno a vrací uživatele zpět do aplikace.

def closeEvent (self, event):
messageBox = QMessageBox ()
title = "Ukončit aplikaci?"
message = "VAROVÁNÍ !!\ n \ nPokud ukončíte práci bez uložení, budou provedeny všechny změny provedené v souboru
být ztracen.\ n \ nUložte soubor před ukončením?"
odpověď = messageBox.otázka (já, titul, zpráva, messageBox.Ano | messageBox.Ne |
messageBox.Zrušit, messageBox.Zrušení)
pokud odpověď == messageBox.Ano:
return_value = self.save_current_file ()
if return_value == False:
událost.ignorovat()
elif odpověď == messageBox.Ne:
událost.akceptovat()
jiný:
událost.ignorovat()

Varovné pole „neplatný soubor“ neobsahuje žádné zvonky a píšťalky. Pouze předává zprávu, že cestu k souboru nelze určit.

def invalid_path_alert_message (self):
messageBox = QMessageBox ()
messageBox.setWindowTitle ("Neplatný soubor")
messageBox.setText ("Vybraný název souboru nebo cesta není platný. Vyberte platný soubor.")
messageBox.exec ()

Nakonec se hlavní smyčka aplikace pro zpracování událostí a kreslení widgetů spustí pomocí „.metoda exec_ () ”.

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

Spuštění aplikace

Stačí uložit celý kód do textového souboru, nastavit příponu souboru na „.py ”, označte spustitelný soubor a spusťte jej pro spuštění aplikace. Například pokud je název souboru „simple_text_editor.py ”, musíte spustit následující dva příkazy:

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

Co můžete udělat pro vylepšení kódu

Výše uvedený kód funguje dobře pro textový editor s holými kostmi. Z praktických důvodů to však nemusí být užitečné, protože postrádá mnoho funkcí, které běžně vidíme v dobrých textových editorech. Kód můžete vylepšit přidáním nových funkcí, jako jsou čísla řádků, zvýraznění řádků, zvýraznění syntaxe, více karet, ukládání relací, panel nástrojů, rozbalovací nabídky, detekce změny vyrovnávací paměti atd.

Závěr

Tento článek se zaměřuje hlavně na poskytnutí výchozího bodu pro vytváření aplikací PyQt. Pokud v kódu najdete chyby nebo chcete něco navrhnout, zpětná vazba je vítána.

Přidejte gesta myši do Windows 10 pomocí těchto bezplatných nástrojů
V posledních letech se počítače a operační systémy značně vyvinuly. Bývaly doby, kdy uživatelé museli procházet správci souborů pomocí příkazů. Stejně...
Ovládejte a spravujte pohyb myši mezi více monitory ve Windows 10
Správce myší se dvěma displeji umožňuje ovládat a konfigurovat pohyb myši mezi více monitory zpomalením jeho pohybů poblíž hranice. Windows 10/8 vám u...
WinMouse vám umožňuje přizpůsobit a vylepšit pohyb ukazatele myši na PC s Windows
Chcete-li vylepšit výchozí funkce ukazatele myši, použijte freeware WinMouse. Přidává další funkce, které vám pomohou vytěžit ze své skromné ​​myši ma...