Как правильно воспользоваться методом, создающим pyqt кнопку, находящимся в другом python-файле?
Мне показалось, что будет лучше, если я отделю некоторые графические составляющие от основного кода. Поэтому решил сделать класс в новом python-файле, который будет содержать функции, создающие графические элементы с нужными мне характеристиками.
Для начала в файле Design.py создал класс UIClass, в котором находится метод create_button(), создающий простую кнопку. Этим методом хочу воспользоваться в файле с основным кодом - Main.py. Делаю это я неправильно, из-за чего возникает такая ошибка:
QLayout: Cannot add a null widget to QVBoxLayout/
Я понимаю, что делаю очень глупую ошибку, но даже не знаю, как гуглить такой вопрос. Пожалуйста, подскажите, как поправить код?
Вот код файла Design.py:
from PyQt5 import QtWidgets
class UIClass:
def create_button(self):
self.button = QtWidgets.QPushButton("Кнопка")
Вот код файла Main.py:
from PyQt5 import QtWidgets
import Design
class MyWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
self.ui = Design.UIClass()
self.button1 = self.ui.create_button()
self.vbox = QtWidgets.QVBoxLayout()
self.vbox.addWidget(self.button1)
self.setLayout(self.vbox)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
Ответы (1 шт):
Если у меня возникает идея вынести в отдельное место создание какого-либо виджета
и не важно где он находится, в основном модуле или нет (если нет - делаем импорт),
, например пусть это будет кнопка.
Я бы предложил при создании класса наследоваться от QPushButton
и передал бы все необходимые параметры, которые мне нужны в том или ином случае.
Попробуйте:
from PyQt5 import QtWidgets, QtGui
import random
class PushButton(QtWidgets.QPushButton):
def __init__(self, text, color, parent=None):
super(PushButton, self).__init__(text, parent)
self.setText(text)
self.setStyleSheet(f"background-color: {color.name()}; font: bold 20px;")
self.clicked.connect(lambda: print(self.text()))
class MyWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
vbox = QtWidgets.QVBoxLayout(self)
for i in range(3):
self.button = PushButton(
f'Button {i}',
QtGui.QColor(*random.sample(range(255), 3)),
self
)
vbox.addWidget(self.button)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
