Python, PyQt5 is it possible to draw a rectangle without using OOP?

You need to draw a rectangle (red for example) and create a method to change its size WITHOUT using an object-oriented approach.:

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
Author: S. Nick, 2020-09-16

1 answers

Sorry, but without the basics of OOP, you will not succeed! Not in the sense that it is impossible to implement what you have in mind, but in the fact that this approach is very limited and in my opinion wrong.

I'll give you an example that does almost exactly what you asked.

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_())

enter a description of the image here

 2
Author: S. Nick, 2020-09-16 20:21:55