Как правильно создать плагины для своей программы?
Есть программа, написанная на 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 кнопки при её нажатии?
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Если я вас правильно понял, попробуйте так:
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

