主页 > GUI教程 > 正文

PyQt完成挂钟作用

留意:本程序在Python3.3+PyQt5测验通过

首要意图是为了训练运用Qt绘图的相关常识

'''
Created on 2013-7-2
@author: badboy
Email:lucky.haiyu@gmail.com
QQ:43831266
'''
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
 
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 i in 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 i in 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_()


上一篇:python 的 Tkinter完成一个简易计算器
下一篇:Python 打包东西 PyInstaller 2.1 发布

PythonTab微信大众号:

Python技能交流合作群 ( 请勿加多个群 ):

群1: 87464755

群2: 333646237

群3: 318130924

群4: 385100854