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
import sys
из PyQt5.QtWidgets импортируют QWidget, QApplication, QVBoxLayout, QHBoxLayout
из PyQt5.QtWidgets импортируют QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
из PyQt5.QtGui импорт QKeySequence
из PyQt5 импорт Qt
Окно класса (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 = "Файл без названия"
себя.title = QLabel (текст)
себя.заглавие.setWordWrap (Истина)
себя.заглавие.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (self.заглавие)
себя.setLayout (vbox)
себя.scrollable_text_area = QTextEdit ()
vbox.addWidget (self.scrollable_text_area)
def open_new_file (сам):
себя.file_path, filter_type = QFileDialog.getOpenFileName (self, «Открыть новый файл»,
"", "Все файлы (*)")
если я.Путь файла:
с открытым.file_path, "r") как f:
file_contents = f.читать()
себя.заглавие.setText (self.Путь файла)
себя.scrollable_text_area.setText (содержимое_файла)
еще:
себя.invalid_path_alert_message ()
def save_current_file (сам):
если не я.Путь файла:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Сохранить этот файл
как… "," "," Все файлы (*) ")
если новый_файл_путь:
себя.file_path = новый_file_path
еще:
себя.invalid_path_alert_message ()
вернуть ложь
file_contents = себя.scrollable_text_area.toPlainText ()
с открытым.file_path, "w") как f:
ж.написать (file_contents)
себя.заглавие.setText (self.Путь файла)
def closeEvent (себя, событие):
messageBox = QMessageBox ()
title = "Выйти из приложения?"
message = "ВНИМАНИЕ! !!\ n \ nЕсли выйти без сохранения, любые изменения, внесенные в файл
будет потеряно.\ n \ nСохранить файл перед выходом?"
reply = messageBox.вопрос (я, заголовок, сообщение, messageBox.Да | окно сообщения.Нет |
окно сообщения.Отмена, messageBox.Отмена)
если ответ == messageBox.Да:
return_value = self.save_current_file ()
если return_value == False:
мероприятие.игнорировать ()
elif reply == messageBox.Нет:
мероприятие.принимать()
еще:
мероприятие.игнорировать ()
def invalid_path_alert_message (сам):
messageBox = QMessageBox ()
окно сообщения.setWindowTitle ("Неверный файл")
окно сообщения.setText ("Выбранное имя файла или путь недействительны. Пожалуйста, выберите
действительный файл.")
окно сообщения.exec ()
если __name__ == '__main__':
app = QApplication (sys.argv)
w = Окно ()
ш.showMaximized ()
sys.выход (приложение.exec_ ())

Объяснение

Первая часть кода просто импортирует модули, которые будут использоваться во всем примере:

import 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 будет возвращен.

Окно класса (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 = "Файл без названия"
себя.title = QLabel (текст)
себя.заглавие.setWordWrap (Истина)
себя.заглавие.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (self.заглавие)
себя.setLayout (vbox)

Затем в макет добавляется текстовая область с помощью объекта QTextEdit. Виджет QTextEdit предоставит вам редактируемую прокручиваемую область для работы с. Этот виджет поддерживает типичное копирование, вставку, вырезание, отмену, повтор, выбор всего и т. Д. горячие клавиши. Вы также можете использовать контекстное меню правой кнопки мыши в текстовой области.

себя.scrollable_text_area = QTextEdit ()
vbox.addWidget (self.scrollable_text_area)

Метод open_new_fie вызывается, когда пользователь завершает Сочетание клавиш. Класс QFileDialog представляет пользователю диалоговое окно выбора файла. Путь к файлу определяется после того, как пользователь выберет файл в средстве выбора. Если путь к файлу действителен, текстовое содержимое считывается из файла и устанавливается в виджет QTextEdit. Это делает текст видимым для пользователя, меняет заголовок на новое имя файла и завершает процесс открытия нового файла. Если по какой-либо причине путь к файлу не может быть определен, пользователю отображается окно с предупреждением «недопустимый файл».

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

Метод save_current_file вызывается всякий раз, когда пользователь завершает Сочетание клавиш. Вместо получения нового пути к файлу QFileDialog теперь просит пользователя указать путь. Если путь к файлу действителен, содержимое, видимое в виджете QTextEdit, записывается в полный путь к файлу, в противном случае отображается окно предупреждения «недопустимый файл». Название редактируемого файла также изменяется на новое местоположение, указанное пользователем.

def save_current_file (сам):
если не я.Путь файла:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Сохранить этот файл
как… "," "," Все файлы (*) ")
если новый_файл_путь:
себя.file_path = новый_file_path
еще:
себя.invalid_path_alert_message ()
вернуть ложь
file_contents = себя.scrollable_text_area.toPlainText ()
с открытым.file_path, "w") как f:
ж.написать (file_contents)
себя.заглавие.setText (self.Путь файла)

Метод closeEvent является частью API обработки событий PyQt5. Этот метод вызывается всякий раз, когда пользователь пытается закрыть окно с помощью кнопки с крестиком или нажатием комбинация клавиш. При срабатывании события закрытия пользователю отображается диалоговое окно с тремя вариантами выбора: «Да», «Нет» и «Отмена». Кнопка «Да» сохраняет файл и закрывает приложение, а кнопка «Нет» закрывает файл без сохранения содержимого. Кнопка «Отмена» закрывает диалоговое окно и возвращает пользователя в приложение.

def closeEvent (себя, событие):
messageBox = QMessageBox ()
title = "Выйти из приложения?"
message = "ВНИМАНИЕ! !!\ n \ nЕсли вы выйдете без сохранения, любые изменения, внесенные в файл, будут
Потерянный.\ n \ nСохранить файл перед выходом?"
reply = messageBox.вопрос (я, заголовок, сообщение, messageBox.Да | окно сообщения.Нет |
окно сообщения.Отмена, messageBox.Отмена)
если ответ == messageBox.Да:
return_value = self.save_current_file ()
если return_value == False:
мероприятие.игнорировать ()
elif reply == messageBox.Нет:
мероприятие.принимать()
еще:
мероприятие.игнорировать ()

В окне предупреждения «недопустимый файл» нет никаких наворотов. Он просто передает сообщение о том, что путь к файлу не может быть определен.

def invalid_path_alert_message (сам):
messageBox = QMessageBox ()
окно сообщения.setWindowTitle ("Неверный файл")
окно сообщения.setText ("Выбранное имя файла или путь недействительны. Пожалуйста, выберите действительный файл.")
окно сообщения.exec ()

Наконец, основной цикл приложения для обработки событий и рисования виджетов запускается с помощью символа «.exec_ () »метод.

если __name__ == '__main__':
app = QApplication (sys.argv)
w = Окно ()
ш.showMaximized ()
sys.выход (приложение.exec_ ())

Запуск приложения

Просто сохраните полный код в текстовый файл, установите расширение файла на «.py », отметьте исполняемый файл и запустите его, чтобы запустить приложение. Например, если имя файла - «simple_text_editor.py », вам необходимо выполнить следующие две команды:

$ chmod + x simple_text_editor.ру
$ ./ simple_text_editor.ру

Что вы можете сделать, чтобы улучшить код

Приведенный выше код отлично подходит для простого текстового редактора. Однако он может быть бесполезен для практических целей, поскольку в нем отсутствуют многие функции, которые обычно встречаются в хороших текстовых редакторах. Вы можете улучшить код, добавив новые функции, такие как номера строк, выделение строк, выделение синтаксиса, несколько вкладок, сохранение сеанса, панель инструментов, раскрывающиеся меню, обнаружение изменения буфера и т. Д.

Заключение

В этой статье основное внимание уделяется обеспечению отправной точки для создания приложений PyQt. Если вы обнаружили ошибки в коде или хотите что-то подсказать, обратная связь приветствуется.

WinMouse позволяет настраивать и улучшать движение указателя мыши на ПК с Windows
Если вы хотите улучшить функции указателя мыши по умолчанию, используйте бесплатное ПО WinMouse. Он добавляет дополнительные функции, которые помогут ...
Левая кнопка мыши не работает в Windows 10
Если вы используете выделенную мышь со своим ноутбуком или настольным компьютером, но левая кнопка мыши не работает в Windows 10/8/7 по какой-то причи...
Курсор прыгает или перемещается случайным образом при наборе текста в Windows 10
Если вы обнаружите, что ваш курсор мыши прыгает или перемещается сам по себе, автоматически, случайным образом при вводе текста на ноутбуке или компью...