Python

Как да напиша прост текстов редактор в PyQt5

Как да напиша прост текстов редактор в PyQt5
Тази статия ще обхване ръководство за създаване на прост текстов редактор в Python3 и PyQt5. Qt5 е набор от междуплатформени библиотеки, написани на C ++, използвани главно за създаване на богати графични приложения. PyQt5 осигурява Python обвързвания за последната версия на Qt5. Всички примерни кодове в тази статия са тествани с Python 3.8.2 и PyQt5 версия 5.14.1 на Ubuntu 20.04.

Инсталиране на PyQt5 в Linux

За да инсталирате PyQt5 в последната версия на Ubuntu, изпълнете командата по-долу:

$ sudo apt инсталира python3-pyqt5

Ако използвате друга дистрибуция на Linux, потърсете термина „Pyqt5“ в мениджъра на пакети и го инсталирайте от там. Като алтернатива можете да инсталирате PyQt5 от мениджъра на пакети pip, като използвате командата по-долу:

$ pip инсталирайте pyqt5

Имайте предвид, че в някои дистрибуции може да се наложи да използвате командата pip3, за да инсталирате правилно PyQt5.

Пълен код

Публикувам пълен код предварително, за да можете по-добре да разберете контекста за отделни кодови фрагменти, обяснени по-късно в статията. Ако сте запознати с Python и PyQt5, можете просто да се обърнете към кода по-долу и да пропуснете обяснението.

#!/ usr / bin / env python3
импортиране на sys
от PyQt5.QtWidgets импортират QWidget, QApplication, QVBoxLayout, QHBoxLayout
от PyQt5.QtWidgets импортират QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
от PyQt5.QtGui импортира QKeySequence
от PyQt5 импортиране на Qt
клас Window (QWidget):
def __init __ (самостоятелно):
супер ().__в него__()
себе си.file_path = Няма
себе си.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), самостоятелно)
себе си.open_new_file_shortcut.активиран.свързване (самостоятелно.open_new_file)
себе си.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), самостоятелно)
себе си.save_current_file_shortcut.активиран.свързване (самостоятелно.save_current_file)
vbox = QVBoxLayout ()
text = "Файл без заглавие"
себе си.заглавие = QLabel (текст)
себе си.заглавие.setWordWrap (Вярно)
себе си.заглавие.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (самостоятелно.заглавие)
себе си.setLayout (vbox)
себе си.scrollable_text_area = QTextEdit ()
vbox.addWidget (самостоятелно.scrollable_text_area)
def open_new_file (самостоятелно):
себе си.file_path, filter_type = QFileDialog.getOpenFileName (самостоятелно, "Отваряне на нов файл",
"", "Всички файлове (*)")
ако аз.файлова пътека:
с отворен (самостоятелно.file_path, "r") като f:
file_contents = f.Прочети()
себе си.заглавие.setText (самостоятелно.файлова пътека)
себе си.scrollable_text_area.setText (файл_съдържание)
друго:
себе си.invalid_path_alert_message ()
def save_current_file (самостоятелно):
ако не и себе си.файлова пътека:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Запазване на този файл
като ... "," "," Всички файлове (*) ")
ако new_file_path:
себе си.file_path = new_file_path
друго:
себе си.invalid_path_alert_message ()
връщане False
file_contents = самостоятелно.scrollable_text_area.toPlainText ()
с отворен (самостоятелно.file_path, "w") като f:
е.запис (file_contents)
себе си.заглавие.setText (самостоятелно.файлова пътека)
def closeEvent (самостоятелно, събитие):
messageBox = QMessageBox ()
title = "Изход от приложението?"
message = "ПРЕДУПРЕЖДЕНИЕ !!\ n \ nАко излезете, без да запазвате, всички промени, направени във файла
ще се загуби.\ n \ nЗапишете файла преди да излезете?"
reply = messageBox.въпрос (самостоятелно, заглавие, съобщение, messageBox.Да | messageBox.Не |
messageBox.Отказ, messageBox.Отказ)
ако отговорът == messageBox.Да:
return_value = самостоятелно.save_current_file ()
ако return_value == False:
събитие.игнорира ()
elif reply == messageBox.Не:
събитие.приемете ()
друго:
събитие.игнорира ()
def invalid_path_alert_message (самостоятелно):
messageBox = QMessageBox ()
messageBox.setWindowTitle ("Невалиден файл")
messageBox.setText ("Избраното име на файл или път не е валидно. Моля, изберете a
валиден файл.")
messageBox.exec ()
ако __name__ == '__main__':
app = QApplication (sys.argv)
w = прозорец ()
w.showMaximized ()
sys.изход (ап.exec_ ())

Обяснение

Първата част на кода просто импортира модули, които ще бъдат използвани в цялата извадка:

импортиране на sys
от PyQt5.QtWidgets импортират QWidget, QApplication, QVBoxLayout, QHBoxLayout
от PyQt5.QtWidgets импортират QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
от PyQt5.QtGui импортира QKeySequence
от PyQt5 импортиране на Qt

В следващата част се създава нов клас, наречен “Window”, който наследява от клас “QWidget”. Класът QWidget предоставя често използвани графични компоненти в Qt. Използвайки “super”, можете да се уверите, че родителският Qt обект се връща.

клас Window (QWidget):
def __init __ (самостоятелно):
супер ().__в него__()

Някои променливи са дефинирани в следващата част. Пътят на файла по подразбиране е зададен на „Няма“ и преки пътища за отваряне на файл с помощта и запазване на файл с помощта на са дефинирани с помощта на клас QShortcut. След това тези преки пътища се свързват със съответните им методи, които се извикват всеки път, когато потребителят натисне дефинираните комбинации от клавиши.

себе си.file_path = Няма
себе си.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), самостоятелно)
себе си.open_new_file_shortcut.активиран.свързване (самостоятелно.open_new_file)
себе си.save_current_file_shortcut = QShortcut (QKeySequence ('Ctrl + S'), самостоятелно)
себе си.save_current_file_shortcut.активиран.свързване (самостоятелно.save_current_file)

Използвайки клас QVBoxLayout, се създава ново оформление, към което ще бъдат добавени дъщерни джаджи. Етикет, подравнен по центъра, е зададен за името на файла по подразбиране, като се използва клас QLabel.

vbox = QVBoxLayout ()
text = "Файл без заглавие"
себе си.заглавие = QLabel (текст)
себе си.заглавие.setWordWrap (Вярно)
себе си.заглавие.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (самостоятелно.заглавие)
себе си.setLayout (vbox)

След това към оформлението се добавя текстова област с помощта на обект QTextEdit. Приспособлението QTextEdit ще ви даде редактируема, превъртаща се област, с която да работите. Тази джаджа поддържа типично копиране, поставяне, изрязване, отмяна, повторение, избор на всички и т.н. комбинация от клавиши. Можете също да използвате контекстното меню с десен бутон в текстовата област.

себе си.scrollable_text_area = QTextEdit ()
vbox.addWidget (самостоятелно.scrollable_text_area)

Методът „open_new_fie“ се извиква, когато потребителят завърши клавишна комбинация. Класът QFileDialog представя на потребителя диалогов прозорец за избор на файлове. Пътят на файла се определя, след като потребителят избере файл от инструмента за избор. Ако пътят до файла е валиден, текстовото съдържание се чете от файла и се задава на приспособление QTextEdit. Това прави текста видим за потребителя, променя заглавието на новото име на файла и завършва процеса на отваряне на нов файл. Ако по някаква причина пътят на файла не може да бъде определен, на потребителя се показва предупредително поле „невалиден файл“.

def open_new_file (самостоятелно):
себе си.file_path, filter_type = QFileDialog.getOpenFileName (самостоятелно, "Отваряне на нов файл", "",
"Всички файлове (*)")
ако аз.файлова пътека:
с отворен (самостоятелно.file_path, "r") като f:
file_contents = f.Прочети()
себе си.заглавие.setText (самостоятелно.файлова пътека)
себе си.scrollable_text_area.setText (file_contents)
друго:
себе си.invalid_path_alert_message ()

Методът "save_current_file" се извиква всеки път, когато потребителят завърши клавишна комбинация. Вместо да извлича нов път до файла, QFileDialog сега иска от потребителя да предостави път. Ако пътят до файла е валиден, съдържанието, видимо в приспособлението QTextEdit, се записва в пълния път на файла, в противен случай се показва поле за предупреждение „невалиден файл“. Заглавието на редактирания в момента файл също се променя на новото местоположение, предоставено от потребителя.

def save_current_file (самостоятелно):
ако не и себе си.файлова пътека:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Запазване на този файл
като ... "," "," Всички файлове (*) ")
ако new_file_path:
себе си.file_path = new_file_path
друго:
себе си.invalid_path_alert_message ()
връщане False
file_contents = самостоятелно.scrollable_text_area.toPlainText ()
с отворен (самостоятелно.file_path, "w") като f:
е.запис (file_contents)
себе си.заглавие.setText (самостоятелно.файлова пътека)

Методът „closeEvent“ е част от API за обработка на събития PyQt5. Този метод се извиква всеки път, когато потребител се опита да затвори прозорец с помощта на кръстосания бутон или чрез натискане комбинация от клавиши. При задействане на събитието за затваряне на потребителя се показва диалогов прозорец с три възможности за избор: „Да“, „Не“ и „Отказ“. Бутонът "Да" записва файла и затваря приложението, докато бутонът "Не" затваря файла, без да запазва съдържанието. Бутонът „Отказ“ затваря диалоговия прозорец и връща потребителя обратно към приложението.

def closeEvent (самостоятелно, събитие):
messageBox = QMessageBox ()
title = "Изход от приложението?"
message = "ПРЕДУПРЕЖДЕНИЕ !!\ n \ nАко излезете, без да запазвате, всички промени, направени във файла, ще бъдат
изгубен.\ n \ nЗапишете файла преди да излезете?"
reply = messageBox.въпрос (самостоятелно, заглавие, съобщение, messageBox.Да | messageBox.Не |
messageBox.Отказ, messageBox.Отказ)
ако отговорът == messageBox.Да:
return_value = самостоятелно.save_current_file ()
ако return_value == False:
събитие.игнорира ()
elif reply == messageBox.Не:
събитие.приемете ()
друго:
събитие.игнорира ()

В предупредителното поле „невалиден файл“ няма звънци и свирки. Той просто предава съобщението, че пътят на файла не може да бъде определен.

def invalid_path_alert_message (самостоятелно):
messageBox = QMessageBox ()
messageBox.setWindowTitle ("Невалиден файл")
messageBox.setText ("Избраното име на файл или път не е валидно. Моля, изберете валиден файл.")
messageBox.exec ()

И накрая, основният цикъл на приложение за обработка на събития и изчертаване на приспособления се стартира с помощта на „.метод exec_ () ”.

ако __name__ == '__main__':
app = QApplication (sys.argv)
w = прозорец ()
w.showMaximized ()
sys.изход (ап.exec_ ())

Стартиране на приложението

Просто запазете пълния код в текстов файл, задайте разширението на файла на „.py ”, маркирайте изпълнимия файл и го стартирайте, за да стартирате приложението. Например, ако името на файла е “simple_text_editor.py ”, трябва да изпълните следните две команди:

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

Неща, които можете да направите, за да подобрите кода

Обясненият по-горе код работи добре за текстов редактор с голи кости. Той обаче може да не е полезен за практически цели, тъй като му липсват много функции, често срещани в добрите текстови редактори. Можете да подобрите кода, като добавите нови функции като номера на редове, подчертаване на редове, подчертаване на синтаксис, множество раздели, запазване на сесия, лента с инструменти, падащи менюта, откриване на промяна на буфера и т.н.

Заключение

Тази статия се фокусира главно върху предоставянето на отправна основа за създаване на приложения на PyQt. Ако откриете грешки в кода или искате да предложите нещо, обратната връзка е добре дошла.

Урок за битка за Уеснот
Битката за Уеснот е една от най-популярните стратегически игри с отворен код, които можете да играете по това време. Тази игра не само се разработва о...
0 А.д. Урок
От многото стратегически игри, 0 A.д. успява да се открои като изчерпателно заглавие и много дълбока, тактическа игра, въпреки че е с отворен код. Раз...
Урок за Unity3D
Въведение в Unity 3D Unity 3D е мощен двигател за разработка на игри. Това е кръстосана платформа, която ви позволява да създавате игри за мобилни уст...