pyqt制作电子钟表

举报
风吹稻花香 发表于 2021/08/25 23:14:40 2021/08/25
【摘要】 pyqt制作电子钟表 https://github.com/n0bel/PiClock 自定义表盘背景:  效果图:  code: from PyQt5.QtCore import *from PyQt5.QtGui import *from PyQt5.QtWidgets import * ...

pyqt制作电子钟表

https://github.com/n0bel/PiClock

自定义表盘背景:

 效果图:

 code:


      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()
             # 设置窗口计时器
              window_pale = QPalette()
              window_pale.setBrush(self.backgroundRole(), QBrush(QPixmap("clock.png")))
              self.setPalette(window_pale)
              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)
              transform = QTransform()
             # 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_()
  
 

绘制表盘,效果图:


      '''
      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_()
  
 

文章来源: blog.csdn.net,作者:AI视觉网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/119901975

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。