Python实现模拟时钟代码推荐
作者:hebedich 发布时间:2023-08-03 05:26:09
标签: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_()
0
投稿
猜你喜欢
- asp生成html如果采用utf8编码方式,多数采用的是Adodb.Stream组件,因为fso并不能支持Utf-8最近在写一个生成HTML
- 汉字转换为UTF-8的一段代码终于找到这段代码了,一个ASP写的中文转UTF-8,大家可以试试function chinese2u
- 在数据库应用的设计中,我们往往会需要获取某些表的记录总数,用于判断表的记录总数是否过大,是否需要备份数据等。我们通常的做法是:select
- 作者:Lachlan Hunt概要网络是不断的进化的. 新的和有创意的网站每天都在出现, 从各方面都在冲击着HTML的边界. HTML 4来
- 有的时候取出全部数据库记录也许正好满足你的要求,不过,在大多数情况下我们通常只需得到部分记录。这样一来该如何设计查询呢?当然会更费点脑筋了,
- 代码和说明如下:<%Const ForReading = 1 &nbs
- tips:如果根目录下有favicon.ico,可省去<link rel="shortcut icon" ...&
- 1)用这个方法,把虚拟主机的默认页只设置成一个比如index.asp 在index.asp的最上面加入以下代码:<%if R
- HTML 的空白符处理规则HTML 中的“空白符”包括空格 (space)、制表符 (tab)、换行符 (CR/LF) 三种。我们知道,在默
- 前两天研究了一下textarea的直观行的换行规律,挺复杂啊:直观行怎样取不光要看cols大小,还要看网页编码方式。cols="3
- <!--#include file="strcheck.asp"--> <% '笔者在写程序的
- 即使是简单的脚本语言,应用良好的模式可以得到非常“优美”的代码和较高的效率。尤其是对于交互要求较高的B/S系统,非常有必要用设计模式来优化代
- 可以用作一些资源的释放。1.在一个函数内的defer执行顺序是先写的后执行,后写的先执行(遵循栈结构)func DeferTest1(){
- 数组:复制传递(不要按照c/c++的方式去理解,c/c++中数组是引用传递),定长切片:引用传递,底层实现是3个字段 array(数组) +
- 1,jdk配置由于jdk官网的链接不直接支持wget,可以使用下面的方法下载jdk,其中jdk版本为jdk1.8.0_91:wget --n
- 今天我们来写一个有管理功能的留言板程序。所谓的管理功能,其实就是每条留言前有一个选择框,点中要删除的留言,或者点“删除所有留言”,就完成了批
- 如图:Oracle 11g安装到42%挂了。上度娘查了一下,原来是Oracle安装包的问题,1,2两个包都要下载下来,而且需要解压到相同(同
- 很多朋友都有过制作网页的经历,如今,众多网页的设计都用到了表格。这样不仅有利于网页的维护,同时,提高了网页的观赏性。在众多网页制作风格中,细
- 在一次ASP程序中不能正常连接MSSQL出现出错信息如下:以下为引用的内容:HTTP/1.1 200 OK S
- 现在Web页面的交互方式越来越多样化,其中拖放页面元素也是一种很常见的操作。在这类操作当中有两个主要问题需要解决,一个是事件的注册方式,一般