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
Вікно класу (QWidget):
def __init __ (self):
супер ().__у цьому__()
себе.file_path = Немає
себе.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), self)
себе.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 (True)
себе.заголовок.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (self.назва)
себе.setLayout (vbox)
себе.scrollable_text_area = QTextEdit ()
vbox.addWidget (self.прокручуваний_текст_площа)
def open_new_file (self):
себе.file_path, filter_type = QFileDialog.getOpenFileName (self, "Відкрити новий файл",
"", "Усі файли (*)")
якщо сам.шлях_файлу:
з відкритою (самост.file_path, "r") як f:
file_contents = f.читати ()
себе.заголовок.setText (self.шлях_файлу)
себе.прокручуваний_текст_площа.setText (вміст_файлу)
ще:
себе.invalid_path_alert_message ()
def save_current_file (self):
якщо не я.шлях_файлу:
new_file_path, filter_type = QFileDialog.getSaveFileName (self, "Зберегти цей файл
як… "," "," Усі файли (*) ")
якщо new_file_path:
себе.file_path = new_file_path
ще:
себе.invalid_path_alert_message ()
повернення False
file_contents = self.прокручуваний_текст_площа.toPlainText ()
з відкритою (самост.file_path, "w") як f:
f.запис (вміст_файлу)
себе.заголовок.setText (self.шлях_файлу)
def closeEvent (self, подія):
messageBox = QMessageBox ()
title = "Вийти із програми?"
message = "ПОПЕРЕДЖЕННЯ !!\ n \ nЯкщо ви вийдете без збереження, будь-які зміни, внесені у файл
буде загублено.\ n \ nЗбережіть файл перед виходом?"
відповідь = messageBox.питання (self, title, message, messageBox.Так | messageBox.Ні |
messageBox.Скасувати, messageBox.Скасувати)
якщо відповідь == messageBox.Так:
return_value = self.save_current_file ()
якщо return_value == False:
подія.ігнорувати ()
elif reply == messageBox.Немає:
подія.прийняти ()
ще:
подія.ігнорувати ()
def invalid_path_alert_message (self):
messageBox = QMessageBox ()
messageBox.setWindowTitle ("Недійсний файл")
messageBox.setText ("Вибране ім'я файлу або шлях не є дійсним. Виберіть a
дійсний файл.")
messageBox.exec ()
якщо __name__ == '__основна__':
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

У наступній частині створюється новий клас під назвою “Вікно”, який успадковується від класу “QWidget”. Клас QWidget надає часто використовувані графічні компоненти в Qt. Використовуючи “super”, ви можете забезпечити повернення батьківського об’єкта Qt.

Вікно класу (QWidget):
def __init __ (self):
супер ().__у цьому__()

Деякі змінні визначені в наступній частині. Шлях до файлу за замовчуванням встановлений у „Немає” та ярлики для відкриття файлу за допомогою та збереження файлу за допомогою визначаються за допомогою класу QShortcut. Потім ці ярлики підключаються до відповідних методів, які викликаються кожного разу, коли користувач натискає певні комбінації клавіш.

себе.file_path = Немає
себе.open_new_file_shortcut = QShortcut (QKeySequence ('Ctrl + O'), self)
себе.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 (True)
себе.заголовок.setAlignment (Qt.Qt.AlignCenter)
vbox.addWidget (self.назва)
себе.setLayout (vbox)

Далі до макета додається область тексту за допомогою об'єкта QTextEdit. Віджет QTextEdit надасть вам редаговану, прокручувану область для роботи. Цей віджет підтримує типове копіювання, вставлення, вирізання, скасування, повтор, вибір усіх тощо. Гарячі клавіши. Ви також можете використовувати контекстне меню правою кнопкою миші в текстовій області.

себе.scrollable_text_area = QTextEdit ()
vbox.addWidget (self.прокручуваний_текст_площа)

Метод “open_new_fie” викликається, коли користувач завершує комбінація клавіш. Клас QFileDialog представляє користувачеві діалогове вікно вибору файлів. Шлях до файлу визначається після того, як користувач вибере файл із засобу вибору. Якщо шлях до файлу дійсний, текстовий вміст з нього зчитується і встановлюється як віджет QTextEdit. Це робить текст видимим для користувача, змінює заголовок на нове ім’я файлу та завершує процес відкриття нового файлу. Якщо з якихось причин шлях до файлу визначити неможливо, користувачеві відображається поле попередження "недійсний файл".

def open_new_file (self):
себе.file_path, filter_type = QFileDialog.getOpenFileName (self, "Відкрити новий файл", "",
"Усі файли (*)")
якщо сам.шлях_файлу:
з відкритою (самост.file_path, "r") як f:
file_contents = f.читати ()
себе.заголовок.setText (self.шлях_файлу)
себе.прокручуваний_текст_площа.setText (вміст_файлу)
ще:
себе.invalid_path_alert_message ()

Метод “save_current_file” викликається щоразу, коли користувач завершує комбінація клавіш. Замість отримання нового шляху до файлу, QFileDialog тепер просить користувача надати шлях. Якщо шлях до файлу дійсний, вміст, видимий у віджеті QTextEdit, записується в повний шлях до файлу, інакше відображається поле попередження "недійсний файл". Заголовок файлу, що редагується, також змінено на нове місце, надане користувачем.

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

Метод “closeEvent” є частиною API обробки подій PyQt5. Цей метод викликається щоразу, коли користувач намагається закрити вікно за допомогою кнопки перехрестя або натискання комбінація клавіш. Під час запуску події закриття користувачеві відкривається діалогове вікно з трьома варіантами: «Так», «Ні» та «Скасувати». Кнопка "Так" зберігає файл і закриває програму, тоді як кнопка "Ні" закриває файл, не зберігаючи вміст. Кнопка "Скасувати" закриває діалогове вікно та повертає користувача до програми.

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

У вікні попередження "недійсний файл" немає жодних наворотів. Він просто передає повідомлення, що шлях до файлу неможливо визначити.

def invalid_path_alert_message (self):
messageBox = QMessageBox ()
messageBox.setWindowTitle ("Недійсний файл")
messageBox.setText ("Вибране ім'я файлу або шлях не є дійсним. Виберіть дійсний файл.")
messageBox.exec ()

Нарешті, основний цикл програми для обробки подій та малювання віджетів запускається за допомогою “.метод exec_ () ”.

якщо __name__ == '__основна__':
app = QApplication (sys.argv)
w = Вікно ()
w.showMaximized ()
sys.вихід (додаток.exec_ ())

Запуск програми

Просто збережіть повний код у текстовому файлі, встановіть розширення файлу на “.py ”, позначте файл як виконуваний та запустіть його, щоб запустити програму. Наприклад, якщо ім'я файлу “simple_text_editor.py ”, потрібно виконати дві команди:

$ chmod + x простий_текстовий_редактор.py
$ ./ simple_text_editor.py

Що можна зробити для вдосконалення кодексу

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

Висновок

Ця стаття в основному присвячена забезпеченню початкової бази для створення програм PyQt. Якщо ви виявили помилки в коді або хочете щось запропонувати, вітайте відгук.

Mouse left-click button not working on Windows 10
If you are using a dedicated mouse with your laptop, or desktop computer but the mouse left-click button is not working on Windows 10/8/7 for some rea...
Cursor jumps or moves randomly while typing in Windows 10
If you find that your mouse cursor jumps or moves on its own, automatically, randomly while typing in Windows laptop or computer, then some of these s...
How to reverse Mouse and Touchpads scrolling direction in Windows 10
Mouse and Touchpads not only make computing easy but more efficient and less time-consuming. We cannot imagine a life without these devices, but still...