Инструменты пользователя

Инструменты сайта


products:pussy:other:quick_start

Быстрый старт

Данная статья написана для разработчиков, в ней будет описан процесс разработки плагина на платформе PUSSY. Разработчик должен обладать знаниями и навыками разработки на Python и Qt, в данном случае будет использована привязка к инструментам Qt - PySide6.

Пишем свой плагин

О концепции Плагина читайте в статье. Если говорить коротко, то плагин это просто набор скриптов Python (пакет), который обязан иметь собственный графический интерфейс, в данном случае это класс виджета, который встраивается в окно Менеджера, за этим интерфейсом может скрываться совершенно любая реализация.

Для работы нам потребуется:
* Python3;

В PyCharm создайте новый проект, добавьте в нее папку PUSSY, и пометьте PyUB как Source Root, чтобы иметь возможность импортировать модули из данного пакета.

projectstructinpycharm.jpg

Пишем код

Сделаем пробный плагин - кодовый замок, конечно, это просто игрушка для демонстрации и никаких полезных функций он не делает, но для объяснения основ сгодится.

Описание алгоритма: код от «замка» устанавливается через настройки, если код введен верно, то поле загорается зелеными, иначе – красным, поле блокируется на несколько секунд.

Посмотрим на плагин в общих чертах, по сути это пакет 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 - (опционально) ссылка на класс с пользовательскими настройками (потомок PropertyContainer), в нашем случае это класс Settings.

Методы:

  • init ( self) - инициализация виджета, в данном случае тут производится встраивание интерфейса, сгенерованного с помощью QtDesigner;
  • settings_ edit_ finished ( self, changed: bool) – (выполняется после завершения редактирования настроек, changed принимает значения: True – если хотя бы одно из свойств было изменено, иначе – False), если пользователь изменил код замка, то производится обновления поля _code, поле ввода очищается.

Подробнее о UBWidget здесь .

Перейдем к файлу с настройками ( Settings.py). Его код :

from PyUB.Types import PropertyContainer
from PyUB.Types.Properties import StringProperty
 
class Settings(PropertyContainer):
    code: StringProperty(default_value="12345", input_mask="00000000", name="Код")

Тут определено всего одно свойство для ввода строки. Подробнее о контейнере свойств и самих свойствах смотрите в материалах: Свойство, Контейнер свойств, PropertyContainer.

Итак, все важные классы мы уже определили, теперь нужно сообщить Менеджеру какой класс нужно устанавливать. Для этого в модуле utils есть функция register_ubwidget(), в нее надо передать ссылку на класс-потомок UBWidget, в плагине можно зарегистрировать только один класс, это действие нужно выполнить в файле _ _init.py_ _. Также в этом файле по желанию можно определить дополнительную информацию о плагине, создать переменную ub_info ={…}, это типичный словарь, допускаются ключи и значения только строкового типа, в таблице ниже показан пример оформления, некоторые пункты могут быть исключены по желанию.

Ключ Пример значения Описание
1 description “Этот плагин выводит спутник на орбиту”Описание плагина. Дайте емкое и лаконичное описание плагина. Например, для чего он предназначен и т.д.
2 author «Иван Иванов»Имя автора
3 author_webpage www.ironmesh.ruВеб-страница автора
4 author_email “ivan_ivanov@mail.com” Адрес электронной почты автора
5 version “1.3.4” Версия плагина
6 wiki_url “ivan_ivanov.wiki.com” Ссылка на страницу вики

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

products/pussy/other/quick_start.txt · Последнее изменение: 2023/12/13 14:54 — 127.0.0.1