Python实现模拟时钟代码推荐

作者:hebedich 时间:2023-08-03 05:26:09 

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,模拟时钟
0
投稿

猜你喜欢

  • 当标题不能显示完整的时候

    2007-11-20 13:23:00
  • 获取 Textarea 的光标位置

    2010-11-30 21:33:00
  • 多个datatable共存造成多个表格的checkbox都被选中

    2024-05-11 09:18:42
  • MSSQL分页存储过程完整示例(支持多表分页存储)

    2024-01-15 10:19:21
  • Django3基于WebSocket实现WebShell的详细过程

    2021-12-01 21:34:31
  • JQuery对ASP.NET MVC数据进行更新删除

    2024-06-05 09:32:05
  • ASP程序代码执行时间统计类

    2007-10-15 12:45:00
  • Firefox的默认样式表

    2008-05-09 12:06:00
  • python进行参数传递的方法

    2023-05-21 06:15:32
  • 解决Keyerror ''acc'' KeyError: ''val_acc''问题

    2022-09-05 11:28:12
  • python numpy.ndarray中如何将数据转为int型

    2022-11-21 16:14:09
  • python机器学习实战之K均值聚类

    2022-12-22 21:50:31
  • Python机器学习库scikit-learn使用详解

    2021-08-03 08:21:41
  • python中redis查看剩余过期时间及用正则通配符批量删除key的方法

    2023-08-02 12:12:27
  • golang 检查网络状态是否正常的方法

    2024-05-08 10:45:03
  • 详解golang碎片整理之 fmt.Scan

    2024-02-20 12:51:16
  • 批量更新数据库所有表中字段的内容,中木马后的急救处理

    2024-01-27 21:19:54
  • python模拟菜刀反弹shell绕过限制【推荐】

    2023-07-13 12:56:18
  • Perl中的正则表达式介绍

    2023-08-11 21:14:25
  • Oracle数据库失效对象处理详情

    2023-07-13 16:42:39
  • asp之家 网络编程 m.aspxhome.com