Instalace PyQt5 v Linuxu
Chcete-li nainstalovat PyQt5 v nejnovější verzi Ubuntu, spusťte následující příkaz:
$ sudo apt nainstalovat python3-pyqt5Pokud 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 pyqt5Vš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 python3import 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 sysz 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í
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
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čí
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
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.