Skip to content
Related Articles

Related Articles

Create Analog Clock using PyQt5 in Python
  • Last Updated : 01 Aug, 2020
GeeksforGeeks - Summer Carnival Banner

Prerequisite: Introduction to pyqt-5

A clock or watch is called “analog” when it has moving hands and (usually) hours marked from number 1 to 12 to show you the time. Some have Roman Numerals (I, II, III, etc) instead, or no numbers at all! In other words: not a digital clock.

PyQt5 is a cross-platform GUI toolkit, a set of python bindings for Qt v5. One can develop an interactive desktop application with so much ease because of the tools and simplicity provided by this library. A GUI application consists of Front-end and Back-end.

Approach : 

  • Create a Clock class which inherits the QMainWindow class.
  • Inside the Clock class creating a timer object which updates the whole code after each second. 
  • Create three polygon objects for each hand of the clock .
  • Create a paint event method.
  • Inside the paint event method get the current time and the minimum of windows width or height .
  • Create a painter object and a method to draw the hands. 
  • Inside the method for drawing hands(pointer) take arguments like color, rotation and and polygon object.
  • Rotate the painter object and draw the pointer.
  • Inside the paint event method, according to the current time set the rotation value and call the draw pointer method. 
  • Draw the background image of the clock i.e lines for each hour. 

Below is the implementation :


# importing libraries
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
# creating a clock class
class Clock(QMainWindow):
    # constructor
    def __init__(self):
        # creating a timer object
        timer = QTimer(self)
        # adding action to the timer
        # update the whole code
        # setting start time of timer i.e 1 second
        # setting window title
        # setting window geometry
        self.setGeometry(200, 200, 300, 300)
        # setting background color to the window
        self.setStyleSheet("background : black;")
        # creating hour hand
        self.hPointer = QtGui.QPolygon([QPoint(6, 7),
                                        QPoint(-6, 7),
                                        QPoint(0, -50)])
        # creating minute hand
        self.mPointer = QPolygon([QPoint(6, 7),
                                  QPoint(-6, 7),
                                  QPoint(0, -70)])
        # creating second hand
        self.sPointer = QPolygon([QPoint(1, 1),
                                  QPoint(-1, 1),
                                  QPoint(0, -90)])
        # colors
        # color for minute and hour hand
        self.bColor =
        # color for second hand
        self.sColor =
    # method for paint event
    def paintEvent(self, event):
        # getting minimum of width and height
        # so that clock remain square
        rec = min(self.width(), self.height())
        # getting current time
        tik = QTime.currentTime()
        # creating a painter object
        painter = QPainter(self)
        # method to draw the hands
        # argument : color rotation and which hand should be pointed
        def drawPointer(color, rotation, pointer):
            # setting brush
            # saving painter
            # rotating painter
            # draw the polygon i.e hand
            # restore the painter
        # tune up painter
        # translating the painter
        painter.translate(self.width() / 2, self.height() / 2)
        # scale the painter
        painter.scale(rec / 200, rec / 200)
        # set current pen as no pen
        # draw each hand
        drawPointer(self.bColor, (30 * (tik.hour() + tik.minute() / 60)), self.hPointer)
        drawPointer(self.bColor, (6 * (tik.minute() + tik.second() / 60)), self.mPointer)
        drawPointer(self.sColor, (6 * tik.second()), self.sPointer)
        # drawing background
        # for loop
        for i in range(0, 60):
            # drawing background lines
            if (i % 5) == 0:
                painter.drawLine(87, 0, 97, 0)
            # rotating the painter
        # ending the painter
# Driver code
if __name__ == '__main__':
  app = QApplication(sys.argv)
  # creating a clock object
  win = Clock()
  # show


Attention geek! Strengthen your foundations with the Python Programming Foundation Course and learn the basics.

To begin with, your interview preparations Enhance your Data Structures concepts with the Python DS Course.

My Personal Notes arrow_drop_up
Recommended Articles
Page :