Как написать простой текстовый редактор в 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 install python3-pyqt5

Если вы используете любой другой дистрибутив Linux, выполните поиск термин «Pyqt5» в ​​диспетчере пакетов и установите его оттуда. В качестве альтернативы вы можете установить PyQt5 из диспетчера пакетов pip, используя следующую команду:

$ pip install pyqt5

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

Полный код

Я публикую полный код заранее, чтобы вы могли лучше понять контекст для отдельного кода фрагменты объяснены позже в статье. Если вы знакомы с Python и PyQt5, вы можете просто сослаться на приведенный ниже код и пропустить объяснение.

#!/Usr/bin/env python3

import sys
из PyQt5. QtWidgets импортирует QWidget, QApplication, QVBoxLayout, QHBoxLayout
из PyQt5. QtWidgets импортирует QTextEdit, QLabel, QShortcut, QFileDialog, QtMessage> .QtGui импортировать QKeySequence
из PyQt5 import Qt

Окно класса (QWidget):
def __init __ (self):
super () .__ init__ ()

self.file_path = None

self.open_new_file_shortcut = QShortcut (QKeySequence (‘Ctrl + O’), self)
self .open_new_file_shortcut.activated.connect (self.open_new_file)

self.save_current_file_shortcut = QShortcut (QKeySequence (‘Ctrl + S’), self)
self.save_current_file_file (self.save_current_file)

vbox = QVBoxLayout ()
text = «Файл без названия»
self.title = QLabel (te xt)
self.title.setWordWrap (True)
self.title.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (self.title)
self.setLayout (vbox)

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

def open_new_file (self ):
self.file_path, filter_type = QFileDialog.getOpenFileName (self, «Открыть новый файл»,
«», «Все файлы (*)»)
if self.file_path :
с открытым (self.file_path, «r») как f:
file_contents = f.read ()
self.title.setText (self.file_path)
self.scrollable_text_area.setText (file_contents)
else:
self.invalid_path_alert_message ()

def save_current_file (self):
если нет себя. путь_к_файлу:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, «Сохранить этот файл
как …», «», «Все файлы (*)»)
если путь_новому_файлу :
self.file_path = new_file_path
else:
self.invalid_path_alert_message ()
return False
file_contents = self.scrollable_text_area.toPlainText ()
с open (self.file_path, «w») как f:
f.write (file_contents)
self.title.setText (self.file_path)

def closeEvent (self, event):
messageBox = QMessageBox ()
title = «Выйти из приложения?»
message = «ВНИМАНИЕ !! n nЕсли вы выйти без сохранения, любые изменения, внесенные в файл
, будут потеряны. n nСохранить файл перед выходом? «

reply = messageBox.question (self, title, message, messageBox.Yes | messageBox.No |
messageBox.C ancel, messageBox.Cancel)
if reply == messageBox. Да:
return_value = self.save_current_file ()
if return_value == False:
event.ignore ()
elif reply == messageBox.No:
event.accept ()
else:
event.ignore ()

def invalid_path_alert_message (self):
messageBox = QMessageBox ()
messageBox.setWindowTitle («Недопустимый файл»)
messageBox.setText («Выбранное имя файла или путь недопустим. Выберите
допустимый файл. «)
messageBox.exec ()

if __name__ == ‘__main __’:
app = QApplication ( sys.argv)
w = Window ()
w.showMaximized ()
sys.exit (app.exec_ ())

Объяснение

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

import sys
из PyQt5.QtWidgets импортировать QWidget, QApplication, QVBoxLayout, QHBoxLayout
из PyQt5.QtWidgets импортировать QTextEdit, QLabel, QShortcut, QFileDialog, QMessage5 из PyQtGt; QKeySequence
из PyQt5 import Qt

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

Окно класса (QWidget):
def __init __ (self ):
super () .__ init __ ()

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

self. file_path = None

self.open_new_file_shortcut = QShortcut (QKeySequence (‘Ctrl + O’), self)
self.open_new_file_shortcut.activated.connect (self.open_new_file)

self.save_current_file_shortcut = QShortcut (QKeySequence (‘Ctrl + S’), self)
self.save_current_file_shortcut.activated.connect (self.save_current_file)

Используя класс QVBoxLayout, создается новый макет, в который будут добавлены дочерние виджеты. Выровненная по центру метка устанавливается для имени файла по умолчанию с использованием класса QLabel.

vbox = QVBoxLayout ()
text = «Untitled File»
self.title = QLabel (текст)
self.title.setWordWrap (True)
self.title.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (self. title)
self.setLayout (vbox)

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

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

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

def open_new_file (self):
self .file_path, filter_type = QFileDialog.getOpenFileName (self, «Открыть новый файл», «»,
«Все файлы (*)»)
если self.file_path:
с открытым (self.file_path, «r») как f:
file_contents = f.read ()
self.title.setText (self.file_path)
self.scrollable_text_area.setText ( file_contents)
else:
self.invalid_path_alert_message ()

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

def save_current_file (self):
если не self.file_path:
новый_файл_путь, filter_type = QFileDialog. getSaveFileName (self, «Сохранить этот файл
как …», «», «Все файлы (*)»)
if new_file_path:
self.file_path = new_file_path
else:
self.invalid_path_alert_message ()
return False
file_contents = self.scrollable_text_area.toPlainText ()
с open (self.file_path, «w «) как f:
f.write (file_contents)
self.title.setText (self.file_path)

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

def closeEvent (self, event):
messageBox = QMessageBox ()
title = «Выйти из приложения?»
message = «ПРЕДУПРЕЖДЕНИЕ !! n nЕсли выйти без сохранения, любые изменения, внесенные в файл, будут
потеряны. n nСохранить файл перед выходом? «

reply = messageBox.question (self, title, message, messageBox.Yes | messageBox.No |
messageBox.Cancel, messageBox.Cancel)
if reply == messageBox. Да:
return_value = self.save_current_file ()
if return_value == False:
event.ignore ()
elif reply == messageBox.No:
event.accept ()
else:
event.ignore ()

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

def invalid_path_alert_message (self):
messageBox = QMessageBox ()
messageBox .setWindowTitle («Недопустимый файл»)
messageBox.setText («Выбранное имя файла или путь недействительны. Выберите допустимый файл.»)
messageBox.exec ()

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

if __name__ == ‘__main __’:
app = QApplication (sys.argv)
w = Window ()
w.showMaximized ()
sys.exit (app.exec_ ())

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

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

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

Что можно сделать для улучшения кода

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

Заключение

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

Оцените статью
nanomode.ru
Добавить комментарий