Skip to main content

Drawing Shapes

In this section, we will learn to use the drawing functions under the QPainter object to explore PyQt5's drawing capabilities.

Function Introduction​

Draw Point​

drawPoint(x, y)

Draw a point.

  • x : x-coordinate;
  • y : y-coordinate;

Draw Line​

drawLine(x0, y0, x1, y1)

Draw a straight line.

  • x0, y0 : Starting point coordinates;
  • x1, y1 : Ending point coordinates;

Draw Rectangle​

drawLine(x, y, width, height)

Draw a rectangle.

  • x, y : Starting point coordinates;
  • width : Rectangle width;
  • height : Rectangle height;

Draw Ellipse (Circle)​

drawEllipse(x, y, width, height)

Draw an ellipse.

  • x, y : Starting point coordinates;
  • width : Ellipse width;
  • height : Ellipse height;

When the ellipse's width = height, it draws a circle, where width = height = the diameter of the circle.

Programming Method​

We will use code to draw points, lines, rectangles, and circles:

Let's run the final code first, then explain it:

# -*- coding: utf-8 -*-

# pyQT5 For WalnutPi

from PyQt5 import QtCore, QtGui, QtWidgets

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter,QPen,QBrush
from PyQt5.QtWidgets import QWidget

class Window(QWidget):

def __init__(self):
super().__init__() # Also execute the parent QWidget's initialization
self.setWindowTitle("WalnutPi Paint") # Set window title
self.resize(480,320) # Set window size

# Window background color setting
self.setObjectName("Paint_Window")
self.setStyleSheet("#Paint_Window{background-color: black}") # Black

def paintEvent(self,event):

painter=QPainter(self) # Create drawing object
painter.setPen(Qt.green) # Set pen, green

# Draw point
painter.drawPoint(10,10)

# Draw line
painter.drawLine(20, 10, 80, 10)

# Draw rectangle
painter.drawRect(100, 10, 80, 40)

# Draw circle
painter.drawEllipse(200, 10, 50, 50)


#################
# Main Program Code #
#################
import sys

#【Optional Code】Allow Thonny remote execution
import os
os.environ["DISPLAY"] = ":0.0"

#【Optional Code】Fix display issues on monitors with 2K+ resolution
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)

# Program entry point: build the window and display it
app = QtWidgets.QApplication(sys.argv)
window = Window() # Build window object
window.show() # Display window
#window.showFullScreen() # Fullscreen display window

#【Recommended Code】Allow terminal to interrupt window with ctrl+c for easier debugging
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
timer = QtCore.QTimer()
timer.start(100) # You may change this if you wish.
timer.timeout.connect(lambda: None) # Let the interpreter run each 100 ms

sys.exit(app.exec_()) # Exit process when program closes

Run the code, and you will see the window as follows: shape1


Now let's look at the implementation principle of the code:

The main program entry code is similar to before, creating a new window:

# Program entry point: build the window and display it
app = QtWidgets.QApplication(sys.argv)
window = Window() # Build window object
window.show() # Display window

The newly created window initializes the window title and size, and also sets the background color to black for easier observation of results.

class Window(QWidget):

def __init__(self):
super().__init__() # Also execute the parent QWidget's initialization
self.setWindowTitle("WalnutPi Paint") # Set window title
self.resize(480,320) # Set window size

# Window background color setting
self.setObjectName("Paint_Window")
self.setStyleSheet("#Paint_Window{background-color: black}") # Black

def paintEvent(self,event): is a fixed format. This function is automatically executed after the window is built, so the QPainter object initialization and drawing functions are placed inside it.

def paintEvent(self,event):

painter=QPainter(self) # Create drawing object
painter.setPen(Qt.green) # Set pen, green

# Draw point
painter.drawPoint(10,10)

# Draw line
painter.drawLine(20, 10, 80, 10)

# Draw rectangle
painter.drawRect(100, 10, 80, 40)

# Draw circle
painter.drawEllipse(200, 10, 50, 50)