Python

Kako napisati preprost urejevalnik besedil v PyQt5

Kako napisati preprost urejevalnik besedil v PyQt5
Ta članek bo zajemal navodila za ustvarjanje preprostega urejevalnika besedil v Python3 in PyQt5. Qt5 je nabor medplatformnih knjižnic, napisanih v jeziku C ++, ki se uporabljajo predvsem za ustvarjanje bogatih grafičnih aplikacij. PyQt5 ponuja Pythonove vezi za najnovejšo različico Qt5. Vsi vzorci kode v tem članku so preizkušeni s Pythonom 3.8.2 in PyQt5 različice 5.14.1 na Ubuntu 20.04.

Namestitev PyQt5 v Linux

Če želite namestiti PyQt5 v najnovejšo različico Ubuntuja, zaženite spodnji ukaz:

$ sudo apt namestite python3-pyqt5

Če uporabljate katero koli drugo distribucijo Linuxa, poiščite izraz »Pyqt5« v upravitelju paketov in ga od tam namestite. Lahko pa namestite PyQt5 iz upravitelja paketov pip z uporabo spodnjega ukaza:

$ pip namestite pyqt5

Upoštevajte, da boste v nekaterih distribucijah morda morali uporabiti ukaz pip3 za pravilno namestitev PyQt5.

Celotna koda

Vnaprej objavljam celotno kodo, da boste lahko bolje razumeli kontekst za posamezne delčke kode, razložene v nadaljevanju članka. Če poznate Python in PyQt5, se lahko sklicujete na spodnjo kodo in preskočite razlago.

#!/ usr / bin / env python3
uvoz sys
iz PyQt5.QtWidgets uvozi QWidget, QApplication, QVBoxLayout, QHBoxLayout
iz PyQt5.QtWidgets uvozi QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
iz PyQt5.QtGui uvozi QKeySequence
iz PyQt5 uvozi Qt
okno razreda (QWidget):
def __init __ (samo):
super ().__v__()
sebe.file_path = Brez
sebe.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), samo)
sebe.open_new_file_shortcut.aktivirano.povezati (samo.open_new_file)
sebe.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), samo)
sebe.save_current_file_shortcut.aktivirano.povezati (samo.save_current_file)
vbox = QVBoxLayout ()
text = "Datoteka brez naslova"
sebe.title = QLabel (besedilo)
sebe.naslov.setWordWrap (True)
sebe.naslov.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (self.naslov)
sebe.setLayout (vbox)
sebe.scrollable_text_area = QTextEdit ()
vbox.addWidget (self.scrollable_text_area)
def open_new_file (self):
sebe.pot do datoteke, filter_type = QFileDialog.getOpenFileName (self, "Odpri novo datoteko",
"", "Vse datoteke (*)")
če jaz.pot do datoteke:
z odprtim (self.file_path, "r") kot f:
file_contents = f.preberi ()
sebe.naslov.setText (self.pot_datoteke)
sebe.scrollable_text_area.setText (vsebina_datoteke)
sicer:
sebe.invalid_path_alert_message ()
def save_current_file (self):
če ne jaz.pot do datoteke:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Shrani to datoteko
kot… "," "," Vse datoteke (*) ")
če nova_pot_datoteke:
sebe.file_path = new_file_path
sicer:
sebe.invalid_path_alert_message ()
vrnitev False
file_contents = self.scrollable_text_area.toPlainText ()
z odprtim (self.datoteka_pot, "w") kot f:
f.pisanje (vsebina_datoteke)
sebe.naslov.setText (self.pot_datoteke)
def closeEvent (self, dogodek):
messageBox = QMessageBox ()
title = "Zapri aplikacijo?"
message = "OPOZORILO !!\ n \ nČe zaprete, ne da bi shranili, bodo vse spremembe datoteke narejene
bo izgubljeno.\ n \ nShranite datoteko pred izhodom?"
reply = messageBox.vprašanje (self, naslov, sporočilo, messageBox.Da | messageBox.Ne |
messageBox.Prekliči, messageBox.Prekliči)
če je odgovor == messageBox.Da:
return_value = self.save_current_file ()
če je return_value == False:
dogodek.prezri ()
elif reply == messageBox.Št:
dogodek.sprejme ()
sicer:
dogodek.prezri ()
def invalid_path_alert_message (self):
messageBox = QMessageBox ()
messageBox.setWindowTitle ("Neveljavna datoteka")
messageBox.setText ("Izbrano ime datoteke ali pot ni veljavna. Izberite a
veljavna datoteka.")
messageBox.exec ()
če je __name__ == '__main__':
app = QApplication (sys.argv)
w = okno ()
w.showMaximized ()
sys.izhod (app.exec_ ())

Pojasnilo

Prvi del kode samo uvozi module, ki bodo uporabljeni v celotnem vzorcu:

uvoz sys
iz PyQt5.QtWidgets uvozi QWidget, QApplication, QVBoxLayout, QHBoxLayout
iz PyQt5.QtWidgets uvozi QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
iz PyQt5.QtGui uvozi QKeySequence
iz PyQt5 uvozi Qt

V naslednjem delu se ustvari nov razred z imenom »Window«, ki podeduje razred »QWidget«. Razred QWidget ponuja pogosto uporabljene grafične komponente v Qt. Z uporabo "super" lahko zagotovite, da se vrne nadrejeni objekt Qt.

okno razreda (QWidget):
def __init __ (samo):
super ().__v__()

Nekatere spremenljivke so opredeljene v naslednjem delu. Pot do datoteke je privzeto nastavljena na »Brez« in bližnjice za odpiranje datoteke z uporabo in shranjevanje datoteke z so definirani z uporabo razreda QShortcut. Te bližnjice se nato povežejo s svojimi metodami, ki se pokličejo vsakič, ko uporabnik pritisne določene kombinacije tipk.

sebe.file_path = Brez
sebe.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), samo)
sebe.open_new_file_shortcut.aktivirano.povezati (samo.open_new_file)
sebe.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), samo)
sebe.save_current_file_shortcut.aktivirano.povezati (samo.save_current_file)

Z uporabo razreda QVBoxLayout se ustvari nova postavitev, ki ji bodo dodani podrejeni pripomočki. Oznaka, poravnana po sredini, je nastavljena za privzeto ime datoteke z uporabo razreda QLabel.

vbox = QVBoxLayout ()
text = "Datoteka brez naslova"
sebe.title = QLabel (besedilo)
sebe.naslov.setWordWrap (True)
sebe.naslov.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (self.naslov)
sebe.setLayout (vbox)

Nato se v postavitev z uporabo predmeta QTextEdit doda besedilno območje. Pripomoček QTextEdit vam bo omogočil urejanje, drsno območje za delo. Ta pripomoček podpira tipično kopiranje, lepljenje, izrezovanje, razveljavitev, ponovitev, izbira vseh itd. bližnjice na tipkovnici. V besedilnem območju lahko uporabite tudi kontekstni meni z desnim klikom.

sebe.scrollable_text_area = QTextEdit ()
vbox.addWidget (self.scrollable_text_area)

Metoda “open_new_fie” se pokliče, ko uporabnik dokonča bližnjica na tipkovnici. Razred QFileDialog uporabniku predstavi pogovorno okno za izbiro datotek. Pot do datoteke se določi, ko uporabnik izbere datoteko iz izbirnika. Če je pot do datoteke veljavna, se iz nje prebere besedilna vsebina in nastavi na pripomoček QTextEdit. Tako je besedilo uporabniku vidno, naslov se spremeni v novo ime datoteke in zaključi postopek odpiranja nove datoteke. Če iz nekega razloga poti datoteke ni mogoče določiti, se uporabniku prikaže opozorilno polje »neveljavna datoteka«.

def open_new_file (self):
sebe.pot do datoteke, filter_type = QFileDialog.getOpenFileName (self, "Odpri novo datoteko", "",
"Vse datoteke (*)")
če jaz.pot do datoteke:
z odprtim (self.file_path, "r") kot f:
file_contents = f.preberi ()
sebe.naslov.setText (self.pot_datoteke)
sebe.scrollable_text_area.setText (vsebina_datoteke)
sicer:
sebe.invalid_path_alert_message ()

Metoda "save_current_file" se prikliče vsakič, ko uporabnik dokonča bližnjica na tipkovnici. Namesto da pridobi novo pot do datoteke, QFileDialog zdaj od uporabnika zahteva, da navede pot. Če je pot do datoteke veljavna, se vsebina, vidna v pripomočku QTextEdit, zapiše na celotno pot datoteke, sicer se prikaže opozorilno polje »neveljavna datoteka«. Naslov datoteke, ki se trenutno ureja, se prav tako spremeni na novo mesto, ki ga je določil uporabnik.

def save_current_file (self):
če ne jaz.pot do datoteke:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Shrani to datoteko
kot… "," "," Vse datoteke (*) ")
če je nova_pot_datoteke:
sebe.file_path = new_file_path
sicer:
sebe.invalid_path_alert_message ()
vrnitev False
file_contents = self.scrollable_text_area.toPlainText ()
z odprtim (self.file_path, "w") kot f:
f.pisanje (vsebina_datoteke)
sebe.naslov.setText (self.pot_datoteke)

Metoda “closeEvent” je del API-ja za obdelavo dogodkov PyQt5. Ta metoda se prikliče vsakič, ko poskuša uporabnik zapreti okno s pomočjo gumba za križ ali s pritiskom na kombinacija tipk. Ob sprožitvi zaprtega dogodka se uporabniku prikaže pogovorno okno s tremi možnostmi: "Da", "Ne" in "Prekliči". Gumb "Da" shrani datoteko in zapre aplikacijo, gumb "Ne" pa datoteko, ne da bi shranil vsebino. Gumb »Prekliči« zapre pogovorno okno in uporabnika popelje nazaj v aplikacijo.

def closeEvent (self, dogodek):
messageBox = QMessageBox ()
title = "Zapri aplikacijo?"
message = "OPOZORILO !!\ n \ nČe zaprete, ne da bi shranili, bodo spremembe v datoteki
biti izgubljen.\ n \ nShranite datoteko pred izhodom?"
reply = messageBox.vprašanje (self, naslov, sporočilo, messageBox.Da | messageBox.Ne |
messageBox.Prekliči, messageBox.Prekliči)
če je odgovor == messageBox.Da:
return_value = self.save_current_file ()
če je return_value == False:
dogodek.prezri ()
elif reply == messageBox.Št:
dogodek.sprejme ()
sicer:
dogodek.prezri ()

V opozorilnem polju »neveljavna datoteka« ni nobenih zvončkov. Preprosto sporoča, da poti datoteke ni mogoče določiti.

def invalid_path_alert_message (self):
messageBox = QMessageBox ()
messageBox.setWindowTitle ("Neveljavna datoteka")
messageBox.setText ("Izbrano ime datoteke ali pot ni veljavna. Izberite veljavno datoteko.")
messageBox.exec ()

Nazadnje se glavna aplikacijska zanka za obdelavo dogodkov in risanje pripomočkov zažene z uporabo.exec_ () ”.

če je __name__ == '__main__':
app = QApplication (sys.argv)
w = okno ()
w.showMaximized ()
sys.izhod (app.exec_ ())

Zagon aplikacije

Preprosto shranite celotno kodo v besedilno datoteko, nastavite pripono datoteke na ».py «, označite datoteko kot izvršljivo in jo zaženite, da zaženete aplikacijo. Na primer, če je ime datoteke »simple_text_editor.py ”, morate zagnati naslednja dva ukaza:

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

Stvari, ki jih lahko naredite za izboljšanje kodeksa

Zgoraj razložena koda dobro deluje za urejevalnik besedil z golimi kostmi. Vendar morda ni uporaben za praktične namene, saj nima veliko funkcij, ki jih pogosto vidimo v dobrih urejevalnikih besedil. Kodo lahko izboljšate tako, da dodate nove funkcije, kot so številke vrstic, poudarjanje vrstic, poudarjanje sintakse, več zavihkov, shranjevanje sej, orodna vrstica, spustni meniji, zaznavanje sprememb medpomnilnika itd.

Zaključek

Ta članek se osredotoča predvsem na zagotavljanje izhodišč za ustvarjanje aplikacij PyQt. Če v kodi najdete napake ali želite nekaj predlagati, so povratne informacije dobrodošle.

Najboljši emulatorji igralne konzole za Linux
V tem članku bo navedena priljubljena programska oprema za emulacijo igralne konzole, ki je na voljo za Linux. Emulacija je sloj združljivosti program...
Najboljši Linux Distros za igre na srečo v letu 2021
Operacijski sistem Linux je daleč od prvotnega, preprostega, strežniškega videza. Ta OS se je v zadnjih letih izjemno izboljšal in se je zdaj razvil v...
Kako zajeti in pretakati svojo igralno sejo v Linuxu
V preteklosti je bilo igranje iger le hobi, sčasoma pa je igralniška industrija zabeležila veliko rast glede tehnologije in števila igralcev. Občinstv...