Skip to content

PyQt实现钟表效果

标签:PyQt 实现 钟表

注意:本程序在Python3.3+PyQt5测试通过 主要目的是为了锻炼使用Qt绘图的相关知识 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 ''' Created on 2013-7-2 @author: badboy Email:lucky.haiyu@gmail.com QQ:43831266 ''' from PyQt5.QtCoreimport * from PyQt5.QtGuiimport * from PyQt5.QtWidgetsimport *    class clockForm(QWidget):     def __init__(self,parent=None):         super(clockForm,self).__init__(parent)         self.setWindowTitle("Clock")         self.timer=QTimer()         #设置窗口计时器         self.timer.timeout.connect(self.update)         self.timer.start(1000)                def paintEvent(self,event):         painter=QPainter(self)         painter.setRenderHint(QPainter.Antialiasing)                    #设置表盘中的文字字体         font=QFont("Times",6)         fm=QFontMetrics(font)         fontRect=fm.boundingRect("99")#获取绘制字体的矩形范围                    #分针坐标点         minPoints=[QPointF(50,25),                    QPointF(48,50),                    QPointF(52,50)]                    #时钟坐标点         hourPoints=[QPointF(50,35),                    QPointF(48,50),                    QPointF(52,50)]                    side=min(self.width(),self.height())         painter.setViewport((self.width()-side)/2,(self.height()-side)/2,                             side,side)#始终处于窗口中心位置显示                               #设置QPainter的坐标系统,无论窗体大小如何变化,         #窗体左上坐标为(0,0),右下坐标为(100,100),         #因此窗体中心坐标为(50,50)         painter.setWindow(0,0,100,100)                    #绘制表盘,使用环形渐变色         niceBlue=QColor(150,150,200)         haloGrident=QRadialGradient(50,50,50,50,50)         haloGrident.setColorAt(0.0,Qt.lightGray)         haloGrident.setColorAt(0.5,Qt.darkGray)         haloGrident.setColorAt(0.9,Qt.white)         haloGrident.setColorAt(1.0,niceBlue)         painter.setBrush(haloGrident)         painter.setPen(QPen(Qt.darkGray,1))         painter.drawEllipse(0,0,100,100)                               transform=QTransform()                    #绘制时钟为0的字,以及刻度         painter.setPen(QPen(Qt.black,1.5))         fontRect.moveCenter(QPoint(50,10+fontRect.height()/2))         painter.setFont(font)         painter.drawLine(50,2,50,8)#         painter.drawText(QRectF(fontRect),Qt.AlignHCenter|Qt.AlignTop,"0")                    for iin range(1,12):             transform.translate(50,50)             transform.rotate(30)             transform.translate(-50,-50)             painter.setWorldTransform(transform)             painter.drawLine(50,2,50,8)             painter.drawText(QRectF(fontRect),Qt.AlignHCenter|Qt.AlignTop,"%d" % i)                    transform.reset()                    #绘制分钟刻度线         painter.setPen(QPen(Qt.blue,1))         for iin range(1,60):             transform.translate(50,50)             transform.rotate(6)             transform.translate(-50,-50)             if i%5!=0:                 painter.setWorldTransform(transform)                 painter.drawLine(50,2,50,5)                                               transform.reset()                    #获取当前时间         currentTime=QTime().currentTime()         hour=currentTime.hour()if currentTime.hour()<12 else currentTime.hour()-12         minite=currentTime.minute()         second=currentTime.second()                    #获取所需旋转角度         hour_angle=hour*30.0+(minite/60.0)*30.0         minite_angle=(minite/60.0)*360.0         second_angle=second*6.0                    #时针         transform.translate(50,50)         transform.rotate(hour_angle)         transform.translate(-50,-50)         painter.setWorldTransform(transform)         painter.setPen(Qt.NoPen)         painter.setBrush(QBrush(Qt.darkRed))         painter.drawPolygon(QPolygonF(hourPoints))                    transform.reset()                    #分针         transform.translate(50,50)         transform.rotate(minite_angle)         transform.translate(-50,-50)         painter.setWorldTransform(transform)         painter.setBrush(QBrush(Qt.darkGreen))         painter.drawPolygon(QPolygonF(minPoints))                    transform.reset()         #秒针         transform.translate(50,50)         transform.rotate(second_angle)         transform.translate(-50,-50)         painter.setWorldTransform(transform)         painter.setPen(QPen(Qt.darkCyan,1))         painter.drawLine(50,50,50,20)      if __name__=="__main__":     import sys     app=QApplication(sys.argv)     form=clockForm()     form.show()     app.exec_()

部分信息收集于网络,若有侵权请联系我们.