Create Analog Clock using PyQt5 in Python - GeeksforGeeks

01 Aug, 2020
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
# importing librariesfrom PyQt5.QtWidgets import *from PyQt5 import QtCore, QtGuifrom PyQt5.QtGui import *from PyQt5.QtCore import *import sys  # creating a clock classclass 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 codeif __name__ == '__main__':      app = QApplication(sys.argv)      # creating a clock object  win = Clock()      # show  win.show()      exit(app.exec_())
Output:  
Python-projects
Python-PyQt
Python
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Python Dictionary
Read a file line by line in Python
Enumerate() in Python
How to Install PIP on Windows ?
Iterate over a list in Python
Different ways to create Pandas Dataframe
Python String | replace()
Create a Pandas DataFrame from Lists
Python program to convert a list to string
Reading and Writing to text files in Python