Это старая версия документа!
Содержание
Быстрый старт
Данная статья написана для разработчиков, в ней будет описан процесс разработки плагина на платформе PUSSY. Разработчик должен обладать знаниями и навыками разработки на Python и Qt, в данном случае будет использована привязка к инструментам Qt - PySide6.
Пишем свой плагин
О концепции Плагина читайте в статье. Если говорить коротко, то плагин это просто набор скриптов Python (пакет), который обязан иметь собственный графический интрефейс, в данном случае это класс виджета, который встраивается в окно Менеджера, за этим интерфейсом может скрываться совершенно любая реализация.
Для работы нам потребуется:
- Python3;
- PySide6;
- Инструмент для написания кода (я предпочитаю IDE PyCharm]]);
В PyCharm создайте новый проект, добавьте в нее папку PUSSY, и пометьте PyUB как Source Root, чтобы иметь возможность импортировать модули из данного пакета.
Пишем код плагина
Сделаем пробный плагин - кодовый замок, конечно, это просто игрушка для демонстрации и никаких полезных функций он не делает, но для объяснения основ сгодится.
Описание алгоритма: код от «замка» устанавливается через настройки, если код введен верно, то поле загорается зелеными, иначе – красным, поле блокируется на несколько секунд.
Посмотрим на плагин в общих чертах, по сути это пакет Python - папка, содержащая файл init. py, размещается она в папке manager/Plugins, либо во внешних директориях, указанных в настройках. В папке Plugins есть шаблон (папка Template) скопируйте его, когда будете писать свой плагин, переименуйте папку и файлы как посчитает нужным.
Внимание! Пакеты с именем Template игнорируются при загрузке.
В нашем случае плагин будет разделен на 4 файла (в исходных файла он находится в Plugins/Codelock): init.py – здесь будет производится регистрация класса с интерфейсом и размещается дополнительная информация, ничего более тут выполнять не нужно; View.py – здесь определен главный класс интерфейса; Settings.py – класс с настройками; ui_ form.py – код виджета, сгенерированный в QtDesigner. В зависимости от сложности плагина и предпочтений разработчиков структура может быть любая, но в каждом случае в файле init.py должная происводиться регистрация виджета плагина.
Так выглядит код View.py:
from PyUB.Types import UBWidget from PySide6.QtWidgets import QPushButton from .ui_form import Ui_Form from .Settings import Settings class CodeLock(UBWidget): ub_settings = Settings def __init__(self): super().__init__() self.ui = Ui_Form() self.ui.setupUi(self) self._init_gui() self._code = self.ub_settings.get_property_value("code") def _init_gui(self): for name in dir(self.ui): attr = getattr(self.ui, name) if type(attr) is QPushButton: attr.clicked.connect(self.on_btn) self.ui.lineEdit.setStyleSheet("") self.ui.lineEdit.textChanged.connect(self.text_changed) self.ui.lineEdit.setInputMask(self.ub_settings.get_property("code").p_input_mask) def on_btn(self): if not self.ui.lineEdit.isEnabled(): return s = self.sender() self.ui.lineEdit.setText(self.ui.lineEdit.text() + s.text()) def text_changed(self, text): if len(text) == len(self._code): if text == self._code: self.ui.lineEdit.setStyleSheet(u"background-color: rgb(85, 255, 127);") else: self.ui.lineEdit.setStyleSheet(u"background-color: rgb(240, 54, 8);") self.ui.lineEdit.setEnabled(False) self.id = self.startTimer(5000) def timerEvent(self, event) -> None: self.ui.lineEdit.setStyleSheet("") self.ui.lineEdit.clear() self.ui.lineEdit.setEnabled(1) self.killTimer(self.id) def settings_edit_finished(self, changed:bool) -> None: if not changed: return self._code = self.ub_settings.get_property_value("code") self.ui.lineEdit.clear()
В данном коде определен класса интерфейса, также в нем описана вся логика программы, для крупных программ так делать не рекомендуется. Этот класс унаследован от UBWidget и его экземпляр будет встраиваться в окно Менеджера в качестве вкладки. Код в методе init() выполняется, когда пользователь перешел во вкладку, в которой размещается экземпляр данного класса, или при запуске Менеджера, если пользователь ранее активировал параметр «Инициализировать при запуске» ( init
on
startup).
В данном варианте бы определили следующие атрибуты и методы
:
Поля класса:
- ub_ settings - (опционально) ссылка на класс с пользовательскими настройками (потомок UBPropertyContainer ), в нашем случае это класс MySettings.
Методы:
- init( self) - инициализация виджета, в данном случае тут производится встраивание интерфейса, сгенерованного с помощью QtDesigner;
settings_ edit_ finished ( self, changed: bool) – (выполняется после завершения редактирования настроек, changed принимает значения: True – если хотя бы одно из свойств было изменено, иначе – False), если пользователь изменил код замка, то производится обновления поля _code, поле ввода очищается.
Подробнее о UBWidget здесь .
Перейдем к файлу с настройками ( Settings. py). Его код :
