Python, PyQt5 возможно ли нарисовать прямоугольник не используя ООП?

Нужно нарисовать (красный например) прямоугольник и создать метод для изменения его размера НЕ используя при этом объектно-ориентированный подход:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton


prg = QApplication(sys.argv)

window = QWidget()
base_layer = QVBoxLayout()
rectangle_widget = QWidget()       # В этом виджете разместьить прямоугольник
base_layer.addWidget(rectangle_widget)
window.setLayout(base_layer)

window.show()
sys.exit(prg.exec())


def change_rectangle_size(width):  # этот метод должен менять размер прямоугольника
    pass

Ответы (1 шт):

Автор решения: S. Nick

Извините, но без азов ООП у вас ничего не получится! Не смысле, что нельзя реализовать то, что вы задумали, а в том, что этот подход очень ограниченный и по моему мнению неправильный.

Я вам предложу пример, который делает почти то, что вы спросили.

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QSpinBox
from PyQt5.QtGui import QPen, QPainter
from PyQt5.QtCore import Qt


class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()

        self.w, self.h = 400, 200
        self.pen = QPen()              
        self.pen.setColor(Qt.green)
        self.pen.setWidth(3)               
        
        spinbox = QSpinBox()
        spinbox.setRange(100, 400)
        spinbox.setSingleStep(10)
        spinbox.setValue(100) 
        spinbox.valueChanged.connect(self.change_rectangle_size)
        
        base_layer = QVBoxLayout(self)
        base_layer.addWidget(spinbox, alignment=Qt.AlignLeft | Qt.AlignTop)        

    def paintEvent(self, event):
        painter = QPainter(self)    
        painter.setPen(self.pen)
        painter.drawRect(100, 170, self.w, self.h)    

    def change_rectangle_size(self, value):
        self.w, self.h = value, value/2
        self.update()
        

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.resize(600, 600)
    demo.show()
    sys.exit(app.exec_())

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

→ Ссылка