Python实现模拟时钟代码推荐

 更新时间:2015年11月08日 11:23:51   投稿:hebedich  
本文给大家汇总介绍了下使用Python实现模拟时钟的代码,一共3个例子,后两个是基于QT实现,有需要的小伙伴可以参考下

Python实现模拟时钟代码推荐

# coding=utf8
import sys, pygame, math, random
from pygame.locals import *
from datetime import datetime, date, time
 
 
def print_text(font, x, y, text, color=(255,255,255)):
  imgtext = font.render(text, True, color)
  screen.blit(imgtext, (x,y))
 
def wrap_angle(angle):
  return abs(angle%360)
 
# main
pygame.init()
screen = pygame.display.set_mode((600,500))
pygame.display.set_caption("CLOCK")
font = pygame.font.Font(None, 36)
orange = 220,180,0
white = 255,255,255
yellow = 255,255,0
pink = 255,100,100
 
pos_x = 300
pos_y = 250
radius = 250
angle = 360
 
# repeating loop
while True:
  for event in pygame.event.get():
    if event.type == QUIT:
      sys.exit()
 
  keys = pygame.key.get_pressed()
  if keys[K_ESCAPE]:
    sys.exit()
 
  screen.fill((0,0,100))
 
  # draw circle
  pygame.draw.circle(screen, white, (pos_x,pos_y), radius, 6)
 
  # draw the clock number 1-12
  for n in range(1,13):
    angle = math.radians(n*(360/12)-90)
    x = math.cos(angle)*(radius-20)-10
    y = math.sin(angle)*(radius-20)-10
    print_text(font, pos_x+x, pos_y+y, str(n))
 
  # get the time of day
  today = datetime.today()
  hours = today.hour%12
  minutes = today.minute
  seconds = today.second
 
  # draw the hours hand
  hour_angle = wrap_angle(hours*(360/12)-90)
  hour_angle = math.radians(hour_angle)
  hour_x = math.cos(hour_angle)*(radius-80)
  hour_y = math.sin(hour_angle)*(radius-80)
  target = (pos_x+hour_x, pos_y+hour_y)
  pygame.draw.line(screen, pink, (pos_x,pos_y), target, 12)
 
  # draw the minutes hand
  min_angle = wrap_angle(minutes*(360/60)-90)
  min_angle = math.radians(min_angle)
  min_x = math.cos(min_angle)*(radius-60)
  min_y = math.sin(min_angle)*(radius-60)
  target = (pos_x+min_x, pos_y+min_y)
  pygame.draw.line(screen, orange, (pos_x,pos_y), target, 12)
 
  # draw the seconds hand
  sec_angle = wrap_angle(seconds*(360/60)-90)
  sec_angle = math.radians(sec_angle)
  sec_x = math.cos(sec_angle)*(radius-40)
  sec_y = math.sin(sec_angle)*(radius-40)
  target = (pos_x+sec_x, pos_y+sec_y)
  pygame.draw.line(screen, yellow, (pos_x,pos_y), target, 12)
 
  # draw the center
  pygame.draw.circle(screen, white, (pos_x,pos_y), 20)
 
  print_text(font, 0, 0, str(hours) + ":" + str(minutes) + ":" + str(seconds))
  pygame.display.update()

再来一个例子

import sys
from PyQt4 import QtGui, QtCore 
from PyQt4.QtCore import Qt
from PyQt4.QtCore import QPoint
from PyQt4.QtCore import QTimer
from PyQt4.QtCore import QTime 
from PyQt4.QtGui import QPainter
from PyQt4.QtGui import QColor 
from PyQt4.QtGui import QPolygon
from PyQt4.QtCore import SIGNAL as signal

class Clock(QtGui.QWidget):
  '''
  classdocs
  '''

  def __init__(self):
    '''
    Constructor
    '''
    super(Clock, self).__init__() 
    self.hourColor=QColor(127, 0, 127);
    self.minuteColor=QColor(0, 127, 127, 191)
    self.secondColor=QColor(127, 127,0,120)
    self.initUI()
    self.timer = QTimer()
    self.timer.timeout.connect(self.update)
    self.timer.start(30) 
    self.show()

  def handChange(self):  

    self.side = min(self.width(), self.height())
    self.hand=(max(self.side/200,4), max(self.side/100,8), max(self.side/40,30))
    self.hourHand=QPolygon([QPoint(self.hand[0],self.hand[1]),QPoint(-self.hand[0],self.hand[1]),QPoint(0,-self.hand[2])])
    self.minuteHand=QPolygon([QPoint(self.hand[0],self.hand[1]),QPoint(-self.hand[0],self.hand[1]),QPoint(0,-self.hand[2]*2)])
    self.secondHand=QPolygon([QPoint(self.hand[0],self.hand[1]),QPoint(-self.hand[0],self.hand[1]),QPoint(0,-self.hand[2]*3)]) 

  def set_transparency(self, enabled):
    if enabled:
      self.setAutoFillBackground(False)
    else:
      self.setAttribute(Qt.WA_NoSystemBackground, False)
    #下面这种方式好像不行
#    pal=QtGui.QPalette()
#    pal.setColor(QtGui.QPalette.Background, QColor(127, 127,10,120))
#    self.setPalette(pal) 
    self.setAttribute(Qt.WA_TranslucentBackground, enabled)
    self.repaint()

  def initUI(self):   

    self.setGeometry(300, 300, 300, 200)
    self.setWindowTitle('Clock')
    self.handChange()
    self.rightButton=False
    # 下面两个配合实现窗体透明和置顶
    sizeGrip=QtGui.QSizeGrip(self)
    self.setWindowFlags(Qt.FramelessWindowHint|Qt.WindowStaysOnTopHint|Qt.SubWindow ) 
    #self.setMouseTracking(True);
    self.trans=True

    self.set_transparency(True) 

    quitAction = QtGui.QAction(QtGui.QIcon('quit.png'), '&Quit', self)
    self.connect(quitAction,signal("triggered()"),QtGui.qApp.quit)
    backAction = QtGui.QAction( '&Back', self)
    self.connect(backAction,signal("triggered()"),self.backClicked)
    self.popMenu= QtGui.QMenu() 
    self.popMenu.addAction(quitAction) 
    self.popMenu.addAction(backAction) 

  def resizeEvent(self, e): 
    self.handChange()

  def backClicked(self):
    if self.trans == True :
      self.trans = False 
      self.set_transparency(False)
    else: 
      self.trans = True 
      self.set_transparency(True)

  def mouseReleaseEvent(self,e): 
    if self.rightButton == True:
      self.rightButton=False
      self.popMenu.popup(e.globalPos())

  def mouseMoveEvent(self, e):
    if e.buttons() & Qt.LeftButton:
      self.move(e.globalPos()-self.dragPos)
      e.accept()
  def mousePressEvent(self, e):

    if e.button() == Qt.LeftButton: 
      self.dragPos=e.globalPos()-self.frameGeometry().topLeft() 
      e.accept()
    if e.button() == Qt.RightButton and self.rightButton == False:
      self.rightButton=True

  def paintEvent(self, e): 
    time = QTime.currentTime() 
    qp = QPainter()

    qp.begin(self)
    qp.setRenderHint(QPainter.Antialiasing) # 开启这个抗锯齿,会很占cpu的!
    qp.translate(self.width() / 2, self.height() / 2) 
    qp.scale(self.side / 200.0, self.side / 200.0)

    qp.setPen(QtCore.Qt.NoPen)
    qp.setBrush(self.hourColor)
    qp.save()
    qp.rotate(30.0 * ((time.hour() + time.minute()/ 60.0)))
    qp.drawConvexPolygon(self.hourHand)
    qp.restore()

    qp.setPen(self.hourColor)
    for i in range(12): 
      qp.drawLine(88, 0, 96, 0)
      qp.rotate(30.0) 

    qp.setPen(QtCore.Qt.NoPen)
    qp.setBrush(self.minuteColor)
    qp.save()

    qp.rotate(6.0 * ((time.minute() + (time.second()+time.msec()/1000.0) / 60.0)))
    qp.drawConvexPolygon(self.minuteHand)
    qp.restore()

    qp.setPen(self.minuteColor)
    for i in range(60): 
      if (i % 5) is not 0:
        qp.drawLine(92, 0, 96, 0)
      qp.rotate(6.0) 

    qp.setPen(QtCore.Qt.NoPen)
    qp.setBrush(self.secondColor)
    qp.save()
    qp.rotate(6.0*(time.second()+time.msec()/1000.0))
    qp.drawConvexPolygon(self.secondHand)
    qp.restore() 
    qp.end() 
if __name__ == '__main__':
  app = QtGui.QApplication(sys.argv)
  clock = Clock()
  sys.exit(app.exec_())

例三:

主要是模仿了qt自带的clock例子,然后 通过 python的语法 进行实现,
同时添加了秒针 的实现
用到的工具 有qt 4.8;python 2.7 ;pyqt

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class clock (QWidget):
  def __init__(self):
    QWidget.__init__(self,windowTitle="python clock")
    timer = QTimer(self)
    self.connect(timer, SIGNAL("timeout()"),self,SLOT("update()"))
    timer.start(1000)
    self.resize(200,200)
  def paintEvent(self,e):
    hourColorHand = QPolygon([QPoint(7,8),QPoint(-7,8),QPoint(0,-30)])
    minuteColorHand = QPolygon([QPoint(7,8),QPoint(-7,8),QPoint(0,-70)])
    secondColorHand = QPolygon([QPoint(3,8),QPoint(-3,8),QPoint(0,-90)])
    hourColor = QColor(127,0,127)
    minuteColor = QColor(0,127,127,191)
    secondColor = QColor(0,100,100,100)
    painter = QPainter(self);
    side = min(self.width(),self.height())
    atime =QTime.currentTime()
    painter.setRenderHint(QPainter.Antialiasing)
    painter.translate(self.width()/2,self.height()/2)
    painter.scale(side/200,side/200)
    painter.setPen(Qt.NoPen)
    painter.setBrush(hourColor)
    painter.save()
    painter.rotate(30.0*(atime.hour() + atime.minute()/60.0))
    painter.drawConvexPolygon(hourColorHand)
    painter.restore()
    painter.setPen(hourColor)
    for i in range(0,12):
     painter.drawLine(88,0,96,0)
     painter.rotate(30.0)
    painter.setPen(Qt.NoPen)
    painter.setBrush(minuteColor)
    painter.save()
    painter.rotate(6.0*(atime.minute()+atime.second()/60.0))
    painter.drawConvexPolygon(minuteColorHand)
    painter.restore()
    painter.setPen(minuteColor)
    for i in range(0,60) :
     if (i%5)!=0 :
       painter.drawLine(92,0,96,0)
     painter.rotate(6.0)
    painter.setPen(Qt.NoPen)
    painter.setBrush(secondColor)
    painter.save()
    painter.rotate(6.0 * atime.second())
    painter.drawConvexPolygon(secondColorHand)
    painter.restore()
if __name__ == "__main__" :
   q = QApplication(sys.argv)
   s = clock()
   s.show()
   q.exec_()

相关文章

  • Python实现将json文件生成C语言的结构体的脚本分享

    Python实现将json文件生成C语言的结构体的脚本分享

    这篇文章主要为大家详细介绍了Python如何实现将json文件生成C语言的结构体,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-09-09
  • Pygame如何使用精灵和碰撞检测

    Pygame如何使用精灵和碰撞检测

    本文主要介绍了Pygame如何使用精灵和碰撞检测,它们能够帮助我们跟踪屏幕上移动的大量图像。我们还会了解如何检测两个图像相互重叠或者碰撞的方法。
    2021-11-11
  • 详解Python不同版本之间的切换方法

    详解Python不同版本之间的切换方法

    本文主要介绍了详解Python不同版本之间的切换方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 解决PyQt5 无边框后窗口的移动问题

    解决PyQt5 无边框后窗口的移动问题

    这篇文章主要介绍了解决PyQt5 无边框后窗口的移动问题,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧
    2021-03-03
  • 关于Python的各种文件操作

    关于Python的各种文件操作

    这篇文章主要介绍了关于Python的各种文件操作,适合刚入门的小白或者对于文件操作基础不太牢固的同学,需要的朋友可以参考下
    2023-04-04
  • Python实现随机分层抽样的示例详解

    Python实现随机分层抽样的示例详解

    在数据分析与机器学习的实践中,抽样是不可或缺的一步,分层抽样作为一种常用的抽样方法,能够确保样本在不同类别中的比例与总体一致,下面我们看看如何使用Python实现随机分层抽样吧
    2024-11-11
  • 向量化操作改进数据分析工作流的Pandas Numpy示例分析

    向量化操作改进数据分析工作流的Pandas Numpy示例分析

    这篇文章主要介绍了向量化操作改进数据分析工作流的Pandas Numpy示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 浅析python 通⽤爬⾍和聚焦爬⾍

    浅析python 通⽤爬⾍和聚焦爬⾍

    这篇文章主要介绍了python 通⽤爬⾍和聚焦爬⾍的相关资料,帮助大家更好的了解和使用python 爬虫,感兴趣的朋友可以了解下
    2020-09-09
  • python多线程扫描端口示例

    python多线程扫描端口示例

    这篇文章主要介绍了python多线程扫描端口示例,大家参考使用吧
    2014-01-01
  • Python基础学习之模块的安装和卸载

    Python基础学习之模块的安装和卸载

    其实现在还是有很多刚开始学习的小伙伴,会遇到模块不会安装的情况,或者一遇到报错就懵了,这样就很耽误我们的学习进度。所以,今天我们就来了解一下Python几种安装模块的方法吧
    2022-09-09

最新评论