Python

Kuidas kirjutada PyQt5-s lihtsat tekstiredaktorit

Kuidas kirjutada PyQt5-s lihtsat tekstiredaktorit
Selles artiklis käsitletakse juhendit Python3 ja PyQt5 lihtsa tekstiredaktori loomiseks. Qt5 on platvormiüleste teekide kogum, mis on kirjutatud C ++ keeles ja mida kasutatakse peamiselt rikkalike graafiliste rakenduste loomiseks. PyQt5 pakub Pytoni sidemeid Qt5 uusimale versioonile. Kõiki selle artikli koodinäiteid testitakse Python 3-ga.8.2 ja PyQt5 versioon 5.14.1 Ubuntu 20-l.04.

PyQt5 installimine Linuxi

PyQt5 installimiseks Ubuntu uusimasse versiooni käivitage järgmine käsk:

$ sudo apt installib python3-pyqt5

Kui kasutate mõnda muud Linuxi jaotust, otsige paketihalduris terminit "Pyqt5" ​​ja installige see sealt. Teise võimalusena võite PyQt5 installida pip-paketi haldurist, kasutades järgmist käsku:

$ pip installi pyqt5

Pange tähele, et mõnes jaotuses peate PyQt5 õigeks installimiseks kasutama käsku pip3.

Täielik kood

Postitan eelnevalt kogu koodi, et saaksite paremini mõista artiklis hiljem selgitatud üksikute koodijuppide konteksti. Kui olete Pythoni ja PyQt5-ga tuttav, võite lihtsalt viidata allolevale koodile ja jätta selgituse vahele.

#!/ usr / bin / env python3
impordi süsteem
alates PyQt5.QtWidgetid impordivad QWidget, QApplication, QVBoxLayout, QHBoxLayout
alates PyQt5.QtWidgetid impordivad QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
alates PyQt5.QtGui import QKeySequence
PyQt5 impordi Qt-st
klassi aken (QWidget):
def __init __ (ise):
Super().__selles__()
ise.file_path = Puudub
ise.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), ise)
ise.open_new_file_shortcut.aktiveeritud.ühendama (ise.avatud_ uus_fail)
ise.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), ise)
ise.save_current_file_shortcut.aktiveeritud.ühendama (ise.save_current_file)
vbox = QVBoxLayout ()
text = "Pealkirjata fail"
ise.pealkiri = QLabel (tekst)
ise.pealkiri.setWordWrap (tõene)
ise.pealkiri.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (ise.pealkiri)
ise.setLayout (vbox)
ise.scrollable_text_area = QTextEdit ()
vbox.addWidget (ise.scrollable_text_area)
def open_new_file (ise):
ise.file_path, filter_type = QFileDialog.getOpenFileName (ise, "Ava uus fail",
"", "Kõik failid (*)")
kui ise.faili teekond:
avatud (iseendaga).file_path, "r") kui f:
faili_sisu = f.loe ()
ise.pealkiri.setText (ise.faili teekond)
ise.scrollable_text_area.setText (faili_sisu)
muu:
ise.invalid_path_alert_message ()
def save_current_file (ise):
kui mitte ise.faili teekond:
new_file_path, filter_type = QFileDialog.getSaveFileName (ise, "Salvesta see fail
kui… "," "," Kõik failid (*) ")
if new_file_path:
ise.file_path = uus_faili_teek
muu:
ise.invalid_path_alert_message ()
tagastama Vale
file_contents = ise.scrollable_text_area.toPlainText ()
avatud (iseendaga).file_path, "w") kui f:
f.kirjuta (faili_sisu)
ise.pealkiri.setText (ise.faili teekond)
def closeEvent (ise, sündmus):
messageBox = QMessageBox ()
title = "Lõpeta rakendus?"
sõnum = "HOIATUS !!\ n \ nKui lõpetate salvestamata, muudetakse faili kõik muudatused
läheb kaduma.\ n \ nSalvestage fail enne sulgemist?"
vastus = messageBox.küsimus (ise, pealkiri, sõnum, sõnumikast.Jah | messageBox.Ei |
messageBox.Tühista, messageBox.Tühista)
kui vastus == sõnumikast.Jah:
return_value = ise.save_current_file ()
if return_value == Vale:
sündmus.ignoreeri ()
elif vastus == sõnumikast.Ei:
sündmus.nõustu ()
muu:
sündmus.ignoreeri ()
def invalid_path_alert_message (ise):
messageBox = QMessageBox ()
messageBox.setWindowTitle ("Kehtetu fail")
messageBox.setText ("Valitud failinimi või tee ei sobi. Valige a
kehtiv fail.")
messageBox.exec ()
kui __nimi__ == '__main__':
app = QApplication (sys.argv)
w = aken ()
w.showMaximized ()
sys.väljumine (rakendus.exec_ ())

Selgitus

Koodi esimene osa lihtsalt impordib mooduleid, mida kasutatakse kogu valimis:

impordi süsteem
alates PyQt5.QtWidgetid impordivad QWidget, QApplication, QVBoxLayout, QHBoxLayout
alates PyQt5.QtWidgetid impordivad QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
alates PyQt5.QtGui import QKeySequence
PyQt5 impordi Qt-st

Järgmises osas luuakse uus klass nimega „Aken”, mis pärineb klassist „QWidget”. QWidget-klass pakub Qt-s tavaliselt kasutatavaid graafilisi komponente. „Superi” abil saate tagada, et vanemobjekt Qt tagastatakse.

klassi aken (QWidget):
def __init __ (ise):
Super().__selles__()

Mõned muutujad on määratletud järgmises osas. Faili tee vaikimisi väärtuseks on „Puudub” ja otseteed faili avamiseks ja faili salvestamine määratletakse klassi QShortcut abil. Seejärel ühendatakse need otseteed nende vastavate meetoditega, mida kutsutakse alati, kui kasutaja vajutab määratud klahvikombinatsioone.

ise.file_path = Puudub
ise.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), ise)
ise.open_new_file_shortcut.aktiveeritud.ühendama (ise.avatud_ uus_fail)
ise.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), ise)
ise.save_current_file_shortcut.aktiveeritud.ühendama (ise.save_current_file)

QVBoxLayout klassi abil luuakse uus paigutus, millele lisatakse lapse vidinad. QLabeli klassi abil määratakse vaikefaili nimeks keskele joondatud silt.

vbox = QVBoxLayout ()
text = "Pealkirjata fail"
ise.pealkiri = QLabel (tekst)
ise.pealkiri.setWordWrap (tõene)
ise.pealkiri.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (ise.pealkiri)
ise.setLayout (vbox)

Järgmisena lisatakse paigutusele tekstiala QTextEdit objekti abil. QTextEdit vidin annab teile redigeeritava ja keritava ala, millega töötada. See vidin toetab tüüpilist kopeerimist, kleepimist, lõikamist, tagasivõtmist, uuesti tegemist, kõigi valimist jne. klaviatuuri otseteed. Samuti saate tekstipiirkonnas kasutada paremklõpsuga kontekstimenüüd.

ise.scrollable_text_area = QTextEdit ()
vbox.addWidget (ise.scrollable_text_area)

"Open_new_fie" meetodit kutsutakse siis, kui kasutaja lõpetab kiirklahv. Klass QFileDialog esitab kasutajale failivalija dialoogi. Faili tee määratakse pärast seda, kui kasutaja valib valijast faili. Kui faili tee on kehtiv, loetakse failist tekstisisaldus ja määratakse vidin QTextEdit. See muudab teksti kasutajale nähtavaks, muudab pealkirja uueks failinimeks ja lõpetab uue faili avamise protsessi. Kui mingil põhjusel ei saa faili teed määrata, kuvatakse kasutajale „kehtetu faili“ hoiatuskast.

def open_new_file (ise):
ise.file_path, filter_type = QFileDialog.getOpenFileName (ise, "Ava uus fail", "",
"Kõik failid (*)")
kui ise.faili teekond:
avatud (iseendaga).file_path, "r") kui f:
faili_sisu = f.loe ()
ise.pealkiri.setText (ise.faili teekond)
ise.scrollable_text_area.setText (faili_sisu)
muu:
ise.invalid_path_alert_message ()

Meetodit "save_current_file" kutsutakse alati, kui kasutaja lõpetab kiirklahv. Uue failitee leidmise asemel palub QFileDialog nüüd kasutajal tee anda. Kui faili tee on kehtiv, kirjutatakse QTextEdit vidinas nähtav sisu kogu faili teele, vastasel juhul kuvatakse hoiatuskast „kehtetu fail”. Praegu muudetava faili pealkiri muudetakse ka kasutaja antud uude asukohta.

def save_current_file (ise):
kui mitte ise.faili teekond:
new_file_path, filter_type = QFileDialog.getSaveFileName (ise, "Salvesta see fail
kui… "," "," Kõik failid (*) ")
if new_file_path:
ise.file_path = uus_faili_teek
muu:
ise.invalid_path_alert_message ()
tagastama Vale
file_contents = ise.scrollable_text_area.toPlainText ()
avatud (iseendaga).file_path, "w") kui f:
f.kirjuta (faili_sisu)
ise.pealkiri.setText (ise.faili teekond)

Meetod “closeEvent” on osa PyQt5 sündmuste käitlemise API-st. Seda meetodit nimetatakse alati, kui kasutaja proovib akna sulgeda ristnupu abil või vajutades klahvikombinatsioon. Sule sündmuse käivitamisel kuvatakse kasutajale dialoogiboks kolme valikuga: "Jah", "Ei" ja "Tühista". Nupp “Jah” salvestab faili ja sulgeb rakenduse, samas kui nupp “Ei” sulgeb faili sisu salvestamata. Nupp „Tühista“ sulgeb dialoogiboksi ja viib kasutaja tagasi rakendusse.

def closeEvent (ise, sündmus):
messageBox = QMessageBox ()
title = "Lõpeta rakendus?"
sõnum = "HOIATUS !!\ n \ nKui lõpetate salvestamata, siis toimivad kõik failis tehtud muudatused
eksida.\ n \ nSalvestage fail enne sulgemist?"
vastus = messageBox.küsimus (ise, pealkiri, sõnum, sõnumikast.Jah | messageBox.Ei |
messageBox.Tühista, messageBox.Tühista)
kui vastus == sõnumikast.Jah:
return_value = ise.save_current_file ()
if return_value == Vale:
sündmus.ignoreeri ()
elif vastus == sõnumikast.Ei:
sündmus.nõustu ()
muu:
sündmus.ignoreeri ()

„Kehtetu faili“ hoiatuskastil pole kellasid ja vilesid. See edastab lihtsalt teate, et faili teed ei saa kindlaks teha.

def invalid_path_alert_message (ise):
messageBox = QMessageBox ()
messageBox.setWindowTitle ("Kehtetu fail")
messageBox.setText ("Valitud failinimi või tee ei sobi. Valige kehtiv fail.")
messageBox.exec ()

Viimasena alustatakse sündmuste käitlemise ja vidinate joonistamise peamist rakendussilmu, kasutades.exec_ () ”meetod.

kui __nimi__ == '__main__':
app = QApplication (sys.argv)
w = aken ()
w.showMaximized ()
sys.väljumine (rakendus.exec_ ())

Rakenduse käitamine

Salvestage lihtsalt täielik kood tekstifaili, määrake faililaiendiks “.py ”, märkige fail käivitatava faili ja käivitage see rakenduse käivitamiseks. Näiteks kui faili nimi on „simple_text_editor.py ”, peate käivitama kaks käsku:

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

Asjad, mida saate teha koodi parandamiseks

Eespool selgitatud kood töötab paljasluudega tekstiredaktori jaoks hästi. Kuid see ei pruugi olla kasulik praktilistel eesmärkidel, kuna sellel puuduvad paljud funktsioonid, mida tavaliselt heades tekstiredaktorites näevad. Koodi saate täiustada, lisades uusi funktsioone, näiteks reanumbrid, joonte esiletõstmine, süntakside esiletõstmine, mitu vahelehte, seansi salvestamine, tööriistariba, rippmenüüd, puhvri muutuste tuvastamine jne.

Järeldus

See artikkel keskendub peamiselt PyQt-rakenduste loomise lähtekoha loomisele. Kui leiate koodist vigu või soovite midagi soovitada, on tagasiside oodatud.

10 parimat mängu, mida Ubuntu kaudu mängida
Windowsi platvorm on olnud üks mängude domineerivaid platvorme, kuna tohutu protsent mänge areneb täna Windowsi loomupäraseks toetamiseks. Kas keegi s...
5 parimat arkaadmängu Linuxile
Tänapäeval on arvutid tõsised mängimiseks kasutatavad masinad. Kui te ei saa uut rekordit, teate, mida ma mõtlen. Selles postituses saate teada mõnda ...
Lahing Wesnothi eest 1.13.6 Areng vabastati
Lahing Wesnothi eest 1.13.6 ilmus eelmisel kuul, on 1-s kuues arendusversioon.13.x-seeria ja see pakub mitmeid täiustusi, eelkõige kasutajaliidese ja ...