Как правильно создать плагины для своей программы?

Рейтинг: 1Ответов: 1Опубликовано: 14.03.2023

Есть программа, написанная на PyQt. Пробую добавить туда плагины.
Скачиваешь плагин и используешь. Но проблема в том, что плагины должны уметь менять меню самой программы, её настройки, а в примерах в интернете - максимум создать toplevel окно.
А если импортировать файл программы в файле плагина, то получится бесконечный импорт.

Подскажите пожалуйста, как реализовать нахождение плагином переменных GUI.

Код GUI

from PyQt5 import QtCore, QtGui, QtWidgets
import sys

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(304, 89)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(0, 0, 241, 61))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

Plugin Loader

def LoadPlugins():
    ss = os.listdir('./plugins/')
    sys.path.insert( 0, './plugins/')
    for s in ss:
        if s != "__pycache__":
            print('Found plugin', s)
            plug = __import__(os.path.splitext(s)[ 0], None, None, [''])
            plug.MainClass()
    for plugin in Plugin.__subclasses__():
        p = plugin()
        Plugins.append(p)
        p.MainClass()
 
    return

Как написать сам плагин, чтобы он менял background кнопки при её нажатии?

Ответы

▲ 0Принят

Если я вас правильно понял, попробуйте так:

q1504855.py

import sys
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(304, 89)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(0, 0, 241, 61))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))
        
        
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        
        self.pushButton.setCheckable(True)
        self.pushButton.clicked.connect(self.pushButton_clicked)
        self.background_color = ''
        self.pushButton.setStyleSheet(f"background-color: #c4c4c4;")
        
        modulename = "my_plugin"
        classname = "pluginClass"
        
        package_obj = __import__("plugins." + modulename)
        print(f'package_obj: \n\t{package_obj}')
        
        module_obj = getattr(package_obj, modulename)
        print(f'module_obj: \n\t{module_obj}')
        
        obj = getattr(module_obj, classname)
        print(f'obj: \n\t{obj}')
        
        if issubclass (obj, object):
                self.my_plugin_obj = obj()
                print(f'\nmy_plugin_obj: \n\t{self.my_plugin_obj}')
                self.background_color = self.my_plugin_obj.run()
        else:
                print("Not class")        

    def pushButton_clicked(self):
        if self.pushButton.isChecked():
            self.pushButton.setStyleSheet(
                f"background-color: {self.background_color};")
        else:
            self.pushButton.setStyleSheet(
                f"background-color: #c4c4c4;")


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

my_plugin.py

class pluginClass(object):
    def __init__(self):
        self.background_color = ''
        
    def run(self):
#        print("\nclass pluginClass(object): def run(self):")
        self.background_color = '#00FF00'
        return self.background_color

введите сюда описание изображения

введите сюда описание изображения