„Python“

Kaip parašyti paprastą teksto rengyklę programoje „PyQt5“

Kaip parašyti paprastą teksto rengyklę programoje „PyQt5“
Šis straipsnis apims paprasto „Python3“ ir „PyQt5“ teksto redaktoriaus kūrimo vadovą. Qt5 yra daugiaplatformių bibliotekų, parašytų C ++, rinkinys, daugiausia naudojamas turtingoms grafinėms programoms kurti. „PyQt5“ teikia „Python“ susiejimus naujausiai „Qt5“ versijai. Visi šio straipsnio kodų pavyzdžiai yra išbandomi naudojant „Python 3“.8.2 ir PyQt5 5 versija.14.1 „Ubuntu 20“.04.

„PyQt5“ diegimas „Linux“

Norėdami įdiegti „PyQt5“ naujausioje „Ubuntu“ versijoje, vykdykite toliau nurodytą komandą:

$ sudo apt įdiekite python3-pyqt5

Jei naudojate bet kurį kitą „Linux“ platinimą, paketų tvarkyklėje ieškokite termino „Pyqt5“ ir įdiekite jį iš ten. Arba galite įdiegti „PyQt5“ iš „pip pack manager“ naudodami toliau nurodytą komandą:

$ pip įdiegti pyqt5

Atminkite, kad kai kuriuose platinimuose gali tekti naudoti komandą pip3, kad tinkamai įdiegtumėte PyQt5.

Visas kodas

Iš anksto skelbiu visą kodą, kad galėtumėte geriau suprasti atskirų kodo fragmentų kontekstą, paaiškintą vėliau straipsnyje. Jei esate susipažinę su „Python“ ir „PyQt5“, galite tiesiog kreiptis į toliau pateiktą kodą ir praleisti paaiškinimą.

#!/ usr / bin / env python3
importuoti sistemas
iš PyQt5.„QtWidgets“ importuoja „QWidget“, „QApplication“, „QVBoxLayout“, „QHBoxLayout“
iš PyQt5.„QtWidgets“ importuoja „QTextEdit“, „QLabel“, „QShortcut“, „QFileDialog“, „QMessageBox“
iš PyQt5.„QtGui“ importuoti „QKeySequence“
iš PyQt5 importo Qt
klasės langas (QWidget):
def __init __ (savęs):
super ().__init __ ()
savarankiškai.file_path = Nėra
savarankiškai.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), savarankiškai)
savarankiškai.open_new_file_shortcut.suaktyvinta.prisijungti (savarankiškai.open_new_file)
savarankiškai.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), savarankiškai)
savarankiškai.save_current_file_shortcut.suaktyvinta.prisijungti (savarankiškai.save_current_file)
vbox = QVBoxLayout ()
text = "Failas be pavadinimo"
savarankiškai.pavadinimas = QLabel (tekstas)
savarankiškai.pavadinimas.„setWordWrap“ (tiesa)
savarankiškai.pavadinimas.setAlignment (Qt.Qt.„AlignCenter“)
„vbox“.addWidget (self.pavadinimas)
savarankiškai.„setLayout“ („vbox“)
savarankiškai.scrollable_text_area = QTextEdit ()
„vbox“.addWidget (self.scrollable_text_area)
def open_new_file (savarankiškai):
savarankiškai.file_path, filter_type = QFileDialog.getOpenFileName (savarankiškai, „Atidaryti naują failą“,
"", "Visi failai (*)")
jei pats.bylos kelias:
su atviru (savimi.file_path, "r") kaip f:
file_contents = f.skaityti ()
savarankiškai.pavadinimas.setText (self.bylos kelias)
savarankiškai.scrollable_text_area.setText (file_contents)
Kitas:
savarankiškai.invalid_path_alert_message ()
def save_current_file (savarankiškai):
jei ne pats.bylos kelias:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Išsaugokite šį failą
kaip ... "," "," Visi failai (*) ")
if new_file_path:
savarankiškai.failo_kelas = naujas_failo_kelas
Kitas:
savarankiškai.invalid_path_alert_message ()
grąžinti False
file_contents = savarankiškai.scrollable_text_area.toPlainText ()
su atviru (savimi.file_path, "w") kaip f:
f.rašyti (file_contents)
savarankiškai.pavadinimas.setText (self.bylos kelias)
def closeEvent (savęs, įvykio):
messageBox = QMessageBox ()
title = "Uždaryti programą?"
pranešimas = "ĮSPĖJIMAS !!\ n \ nJei išeisite neišsaugoję, visi faile padaryti pakeitimai
bus pamesta.\ n \ nIšsaugokite failą prieš uždarydami?"
atsakymas = messageBox.klausimas (savastis, pavadinimas, žinutė, žinutė.Taip | žinučių dėžutė.Ne |
žinučių dėžutė.Atšaukti, messageBox.Atšaukti)
jei atsakymas == žinučių dėžutė.Taip:
return_value = self.save_current_file ()
if return_value == Klaidinga:
įvykis.ignoruoti ()
elif atsakymas == žinučių dėžutė.Ne:
įvykis.priimti()
Kitas:
įvykis.ignoruoti ()
def invalid_path_alert_message (savęs):
messageBox = QMessageBox ()
žinučių dėžutė.setWindowTitle („Netinkamas failas“)
žinučių dėžutė.setText ("Pasirinktas failo vardas ar kelias neteisingas. Pasirinkite a
galiojantis failas.")
žinučių dėžutė.exec ()
jei __pavadinimas = = '__main__':
app = QApplication (sys.argv)
w = langas ()
w.showMaximized ()
sys.išėjimas (ap.exec_ ()

Paaiškinimas

Pirmoji kodo dalis tiesiog importuoja modulius, kurie bus naudojami visame pavyzdyje:

importuoti sistemas
iš PyQt5.„QtWidgets“ importuoja „QWidget“, „QApplication“, „QVBoxLayout“, „QHBoxLayout“
iš PyQt5.„QtWidgets“ importuoja „QTextEdit“, „QLabel“, „QShortcut“, „QFileDialog“, „QMessageBox“
iš PyQt5.„QtGui“ importuoti „QKeySequence“
iš PyQt5 importo Qt

Kitoje dalyje sukuriama nauja klasė pavadinimu „Langas“, kuri paveldima iš „QWidget“ klasės. QWidget klasėje pateikiami dažniausiai naudojami grafiniai komponentai Qt. Naudodami „super“ galite įsitikinti, kad grąžinamas pagrindinis Qt objektas.

klasės langas (QWidget):
def __init __ (savęs):
super ().__init __ ()

Kai kurie kintamieji yra apibrėžti kitoje dalyje. Pagal numatytuosius nustatymus failo kelias yra „Nėra“ ir nuorodos, skirtos atidaryti failą naudojant ir išsaugant failą naudojant yra apibrėžti naudojant „QShortcut“ klasę. Tada šie spartieji klavišai susiejami su atitinkamais metodais, kurie iškviečiami, kai tik vartotojas paspaudžia apibrėžtus klavišų derinius.

savarankiškai.file_path = Nėra
savarankiškai.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), savarankiškai)
savarankiškai.open_new_file_shortcut.suaktyvinta.prisijungti (savarankiškai.open_new_file)
savarankiškai.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), savarankiškai)
savarankiškai.save_current_file_shortcut.suaktyvinta.prisijungti (savarankiškai.save_current_file)

Naudojant „QVBoxLayout“ klasę, sukuriamas naujas išdėstymas, prie kurio bus pridėti vaikų valdikliai. Pagal QLabel klasę numatytam failo vardui nustatoma centre lygiuota etiketė.

vbox = QVBoxLayout ()
text = "Failas be pavadinimo"
savarankiškai.pavadinimas = QLabel (tekstas)
savarankiškai.pavadinimas.„setWordWrap“ (tiesa)
savarankiškai.pavadinimas.setAlignment (Qt.Qt.„AlignCenter“)
„vbox“.addWidget (self.pavadinimas)
savarankiškai.„setLayout“ („vbox“)

Tada teksto sritis į maketą įtraukiama naudojant objektą QTextEdit. „QTextEdit“ valdiklis suteiks jums redaguojamą, slenkamą sritį, su kuria galėsite dirbti. Šis valdiklis palaiko įprastą kopijavimą, įklijavimą, iškarpymą, anuliavimą, perdarymą, visų pasirinkimą ir kt. klaviatūros nuorodos. Taip pat galite naudoti dešiniuoju pelės mygtuku spustelėkite kontekstinį meniu teksto srityje.

savarankiškai.scrollable_text_area = QTextEdit ()
„vbox“.addWidget (self.scrollable_text_area)

Metodas „open_new_fie“ iškviečiamas, kai vartotojas užbaigia spartusis klavišas. „QFileDialog“ klasė pateikia failų parinkimo dialogo langą vartotojui. Failo kelias nustatomas vartotojui pasirinkus failą iš rinkiklio. Jei failo kelias yra tinkamas, tekstinis turinys nuskaitomas iš failo ir nustatomas į valdiklį QTextEdit. Tai padaro vartotojui matomą tekstą, pakeičia pavadinimą į naują failo pavadinimą ir užbaigia naujo failo atidarymo procesą. Jei dėl kokių nors priežasčių failo kelio nustatyti negalima, vartotojui rodomas įspėjimo langelis „netinkamas failas“.

def open_new_file (savarankiškai):
savarankiškai.file_path, filter_type = QFileDialog.getOpenFileName (savarankiškai, "Atidaryti naują failą", "",
"Visi failai (*)")
jei pats.bylos kelias:
su atviru (savimi.file_path, "r") kaip f:
file_contents = f.skaityti ()
savarankiškai.pavadinimas.setText (self.bylos kelias)
savarankiškai.scrollable_text_area.setText (file_contents)
Kitas:
savarankiškai.invalid_path_alert_message ()

Metodas „save_current_file“ iškviečiamas, kai tik vartotojas užbaigia spartusis klavišas. Užuot gavęs naują failo kelią, „QFileDialog“ dabar prašo vartotojo pateikti kelią. Jei failo kelias yra tinkamas, valdiklyje „QTextEdit“ matomas turinys įrašomas į visą failo kelią, kitaip rodomas įspėjimo langelis „netinkamas failas“. Šiuo metu redaguojamo failo pavadinimas taip pat keičiamas į naują vartotojo nurodytą vietą.

def save_current_file (savarankiškai):
jei ne pats.bylos kelias:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Išsaugokite šį failą
kaip ... "," "," Visi failai (*) ")
if new_file_path:
savarankiškai.failo_kelas = naujas_failo_kelas
Kitas:
savarankiškai.invalid_path_alert_message ()
grąžinti False
file_contents = savarankiškai.scrollable_text_area.toPlainText ()
su atviru (savimi.file_path, "w") kaip f:
f.rašyti (file_contents)
savarankiškai.pavadinimas.setText (self.bylos kelias)

Metodas „closeEvent“ yra „PyQt5“ įvykių tvarkymo API dalis. Šis metodas vadinamas, kai vartotojas bando uždaryti langą naudodamas kryžminį mygtuką arba spustelėdamas klavišų kombinacija. Įjungus uždarytą įvykį, vartotojui rodomas dialogo langas su trim pasirinkimais: „Taip“, „Ne“ ir „Atšaukti“. Mygtukas „Taip“ išsaugo failą ir uždaro programą, o mygtukas „Ne“ uždaro failą neišsaugodamas turinio. Mygtukas „Atšaukti“ uždaro dialogo langą ir nukreipia vartotoją atgal į programą.

def closeEvent (savęs, įvykio):
messageBox = QMessageBox ()
title = "Uždaryti programą?"
pranešimas = "ĮSPĖJIMAS !!\ n \ nJei išeisite neišsaugoję, bus atlikti visi failo pakeitimai
pasiklysti.\ n \ nIšsaugokite failą prieš uždarydami?"
atsakymas = messageBox.klausimas (savastis, pavadinimas, žinutė, žinutė.Taip | žinučių dėžutė.Ne |
žinučių dėžutė.Atšaukti, messageBox.Atšaukti)
jei atsakymas == žinučių dėžutė.Taip:
return_value = self.save_current_file ()
if return_value == Klaidinga:
įvykis.ignoruoti ()
elif atsakymas == žinučių dėžutė.Ne:
įvykis.priimti()
Kitas:
įvykis.ignoruoti ()

Įspėjimo laukelyje „netinkamas failas“ nėra varpų ir švilpukų. Tai tiesiog perduoda pranešimą, kad failo kelio nepavyko nustatyti.

def invalid_path_alert_message (savęs):
messageBox = QMessageBox ()
žinučių dėžutė.setWindowTitle („Netinkamas failas“)
žinučių dėžutė.setText ("Pasirinktas failo vardas ar kelias neteisingas. Pasirinkite galiojantį failą.")
žinučių dėžutė.exec ()

Galiausiai pagrindinė įvykių tvarkymo ir valdiklių piešimo programa yra pradedama naudojant „.exec_ () “metodas.

jei __pavadinimas = = '__main__':
app = QApplication (sys.argv)
w = langas ()
w.showMaximized ()
sys.išėjimas (ap.exec_ ()

Programos paleidimas

Tiesiog išsaugokite visą kodą tekstiniame faile, nustatykite failo plėtinį į „.py “, pažymėkite failą kaip vykdomąjį ir paleiskite jį, kad paleistumėte programą. Pavyzdžiui, jei failo pavadinimas yra „simple_text_editor“.py “, turite paleisti šias dvi komandas:

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

Dalykai, kuriuos galite padaryti, kad patobulintumėte kodą

Aukščiau paaiškintas kodas puikiai tinka plikų kaulų teksto redaktoriui. Tačiau tai gali būti nenaudinga praktiniais tikslais, nes trūksta daugelio funkcijų, dažniausiai matomų geruose teksto redaktoriuose. Galite patobulinti kodą pridėdami naujų funkcijų, tokių kaip eilutės numeriai, linijų paryškinimas, sintaksės paryškinimas, keli skirtukai, seanso išsaugojimas, įrankių juosta, išskleidžiamieji meniu, buferio pakeitimo aptikimas ir kt.

Išvada

Šiame straipsnyje daugiausia dėmesio skiriama pradinio pagrindo kūrimui „PyQt“ programoms. Jei radote klaidų kode arba norite ką nors pasiūlyti, atsiliepimai yra laukiami.

Kaip įdiegti ir žaisti „Doom“ sistemoje „Linux“
Įvadas į Doom „Doom“ serija atsirado 90-aisiais, išleidus originalų „Doom“. Tai buvo tiesioginis hitas, o nuo to laiko žaidimų serija gavo daugybę apd...
„Vulkan“, skirta „Linux“ vartotojams
Kiekvienos naujos kartos grafikos plokštės matome, kaip žaidimų kūrėjai peržengia grafinės ištikimybės ribas ir artėja prie fotorealizmo. Nepaisant vi...
„OpenTTD“ ir „Simutrans“
Sukurti savo transporto modeliavimą gali būti smagu, atpalaiduojanti ir be galo viliojanti. Štai kodėl jūs turite įsitikinti, kad išbandėte kuo daugia...