PyQt5 模擬鐘錶

  • 2020 年 2 月 10 日
  • 筆記

本程式由PyQt4官方demo升級而來,各指針會隨著系統時間變化而轉動。另加入了秒針和圓盤。

程式碼如下:

#!/usr/bin/env python    from PyQt5 import QtCore, QtGui,QtWidgets    class AnalogClock(QtWidgets.QWidget):      hourHand = QtGui.QPolygon([          QtCore.QPoint(10, 8),          QtCore.QPoint(-10, 8),          QtCore.QPoint(0, -60)      ])      minuteHand = QtGui.QPolygon([          QtCore.QPoint(8, 8),          QtCore.QPoint(-8, 8),          QtCore.QPoint(0, -70)      ])      secondHand = QtGui.QPolygon([          QtCore.QPoint(4, 8),          QtCore.QPoint(-4, 8),          QtCore.QPoint(0, -90)      ])      hourColor = QtGui.QColor(255, 0, 0)      minuteColor = QtGui.QColor(0, 255, 0)      secondColor = QtGui.QColor(0, 0, 255)
    def __init__(self, parent=None):          super(AnalogClock, self).__init__(parent)          timer = QtCore.QTimer(self)          timer.timeout.connect(self.update)          timer.start(1000) # 每1000ms 調用self.update, self.update會調用self.paintEvent          self.setWindowTitle("Analog Clock")          self.resize(200, 200)        def paintEvent(self, event):          side = min(self.width(), self.height())          time = QtCore.QTime.currentTime()#獲取系統當前時間          painter = QtGui.QPainter(self)          painter.setRenderHint(QtGui.QPainter.Antialiasing)#抗鋸齒          painter.translate(self.width() / 2, self.height() / 2)          painter.scale(side / 200.0, side / 200.0)            painter.setPen(QtGui.QColor(0, 0, 0))          painter.drawEllipse(-100,-100,200,200)#畫圓。參數是外接矩形左上點和長寬          #painter.drawEllipse(-10,-10,20,20)            painter.setPen(AnalogClock.hourColor)          for i in range(12): #整點刻度              painter.drawLine(88, 0, 96, 0)              painter.rotate(30.0)          painter.setPen(AnalogClock.minuteColor)          for j in range(60): #小刻度              if (j % 5) != 0:                  painter.drawLine(92, 0, 96, 0)              painter.rotate(6.0)            painter.setPen(QtCore.Qt.NoPen)          painter.setBrush(AnalogClock.hourColor)          painter.save()          painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)))          painter.drawConvexPolygon(AnalogClock.hourHand)          painter.restore()          painter.setPen(QtCore.Qt.NoPen)          painter.setBrush(AnalogClock.minuteColor)          painter.save()          painter.rotate(6.0 * (time.minute() + time.second() / 60.0))          painter.drawConvexPolygon(AnalogClock.minuteHand)          painter.restore()          painter.setPen(QtCore.Qt.NoPen)          painter.setBrush(AnalogClock.secondColor)          painter.save()          painter.rotate(6.0 * time.second() )          painter.drawConvexPolygon(AnalogClock.secondHand)          painter.restore()          painter.setPen(QtGui.QColor(0, 0, 0))          painter.drawEllipse(-5,-5,10,10)#畫圓。參數是外接矩形左上點和長寬
if __name__ == '__main__':      import sys      app = QtWidgets.QApplication(sys.argv)      clock = AnalogClock()      clock.show()      sys.exit(app.exec_())