Python实现模拟时钟代码推荐

yipeiwu_com6年前Python基础

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生成器generator用法实例分析

本文实例讲述了python生成器generator用法。分享给大家供大家参考。具体如下: 使用yield,可以让函数生成一个结果序列,而不仅仅是一个值 例如: def countdo...

python列表操作之extend和append的区别实例分析

本文实例讲述了python列表操作之extend和append的区别。分享给大家供大家参考。具体如下: li = ['a', 'b', 'c'] li.extend(['d', '...

python多线程用法实例详解

本文实例分析了python多线程用法。分享给大家供大家参考。具体如下: 今天在学习尝试学习python多线程的时候,突然发现自己一直对super的用法不是很清楚,所以先总结一些遇到的问题...

Python中的命令行参数解析工具之docopt详解

前言 docopt 是一个开源的库,代码地址:https://github.com/docopt/docopt。它在 README 中就已经做了详细的介绍,并且还附带了很多例子可供学习,...

使用django-guardian实现django-admin的行级权限控制的方法

用django框架来做一些后台管理的web页面简直太方便了,django自带模块级的权限系统,用来做一些内部的系统非常合适,可以大大的减少开发量。但是django自带的权限系统还不支持行...