Create Analog Clock using PyQt5 in Python

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 :
 

Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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):
        super().__init__()
  
        # creating a timer object
        timer = QTimer(self)
  
        # adding action to the timer
        # update the whole code
        timer.timeout.connect(self.update)
  
        # setting start time of timer i.e 1 second
        timer.start(1000)
  
        # setting window title
        self.setWindowTitle('Clock')
  
        # 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 = Qt.green
  
        # color for second hand
        self.sColor = Qt.red
  
    # 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
            painter.setBrush(QBrush(color))
  
            # saving painter
            painter.save()
  
            # rotating painter
            painter.rotate(rotation)
  
            # draw the polygon i.e hand
            painter.drawConvexPolygon(pointer)
  
            # restore the painter
            painter.restore()
  
  
        # tune up painter
        painter.setRenderHint(QPainter.Antialiasing)
  
        # 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
        painter.setPen(QtCore.Qt.NoPen)
  
  
        # 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
        painter.setPen(QPen(self.bColor))
  
        # for loop
        for i in range(0, 60):
  
            # drawing background lines
            if (i % 5) == 0:
                painter.drawLine(87, 0, 97, 0)
  
            # rotating the painter
            painter.rotate(6)
  
        # ending the painter
        painter.end()
  
# Driver code
if __name__ == '__main__':
    
  app = QApplication(sys.argv)
    
  # creating a clock object
  win = Clock()
    
  # show
  win.show()
    
  exit(app.exec_())

chevron_right


Output: 
 




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.


Article Tags :

Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.