欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python Turtle绘制动态时钟

程序员文章站 2024-01-17 21:39:58
...

  • 好久没更新我的博客了,也不想多说什么了,Python的一个副产品,可能网络上到处都是,直接呈现代码吧!

	# -*-coding=utf-8
	  
	import turtle
	from datetime import *
	  
	# 抬起画笔,向前运动一段距离放下
	def Skip(step):
	    turtle.penup()
	    turtle.forward(step)
	    turtle.pendown()
	  
	def mkHand(name, length):
	    # 注册Turtle形状,建立表针Turtle
	    turtle.reset()
	    Skip(-length * 0.1)
	    # 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。
	    turtle.begin_poly()
	    turtle.forward(length * 1.1)
	    # 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。
	    turtle.end_poly()
	    # 返回最后记录的多边形。
	    handForm = turtle.get_poly()
	    turtle.register_shape(name, handForm)
	  
	def Init():
	    global secHand, minHand, hurHand, printer
	    # 重置Turtle指向北
	    turtle.mode("logo")
	    # 建立三个表针Turtle并初始化
	    mkHand("secHand", 135)
	    mkHand("minHand", 125)
	    mkHand("hurHand", 90)
	    secHand = turtle.Turtle()
	    secHand.shape("secHand")
	    minHand = turtle.Turtle()
	    minHand.shape("minHand")
	    hurHand = turtle.Turtle()
	    hurHand.shape("hurHand")
	    
	    for hand in secHand, minHand, hurHand:
	        hand.shapesize(1, 1, 3)
	        hand.speed(0)
	    
	    # 建立输出文字Turtle
	    printer = turtle.Turtle()
	    # 隐藏画笔的turtle形状
	    printer.hideturtle()
	    printer.penup()
	     
	def SetupClock(radius):
	    # 建立表的外框
	    turtle.reset()
	    turtle.pensize(7)
	    for i in range(60):
	        Skip(radius)
	        if i % 5 == 0:
	            turtle.forward(20)
	            Skip(-radius - 20)
	            
	            Skip(radius + 20)
	            if i == 0:
	                turtle.write(int(12), align="center", font=("Courier", 14, "bold"))
	            elif i == 30:
	                Skip(25)
	                turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
	                Skip(-25)
	            elif (i == 25 or i == 35):
	                Skip(20)
	                turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
	                Skip(-20)
	            else:
	                turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
	            Skip(-radius - 20)
	        else:
	            turtle.dot(5)
	            Skip(-radius)
	        turtle.right(6)
	         
	def Week(t):  
	    week = ["星期一", "星期二", "星期三",
	            "星期四", "星期五", "星期六", "星期日"]
	    return week[t.weekday()]
	  
	def Date(t):
	    y = t.year
	    m = t.month
	    d = t.day
	    return "%s %d %d" % (y, m, d)
	  
	def Tick():
	    # 绘制表针的动态显示
	    t = datetime.today()
	    second = t.second + t.microsecond * 0.000001
	    minute = t.minute + second / 60.0
	    hour = t.hour + minute / 60.0
	    secHand.setheading(6 * second)
	    minHand.setheading(6 * minute)
	    hurHand.setheading(30 * hour)
	     
	    turtle.tracer(False)
	    printer.forward(65)
	    printer.write(Week(t), align="center",
	                  font=("Courier", 14, "bold"))
	    printer.back(130)
	    printer.write(Date(t), align="center",
	                  font=("Courier", 14, "bold"))
	    printer.home()
	    turtle.tracer(True)
	  
	    # 100ms后继续调用tick
	    turtle.ontimer(Tick, 100)
	  
	def main():
	    # 打开/关闭龟动画,并为更新图纸设置延迟。
	    turtle.tracer(False)
	    Init()
	    SetupClock(160)
	    turtle.tracer(True)
	    Tick()
	    turtle.mainloop()
	  
	if __name__ == "__main__":
	    main()