运行效果:

源代码:

  1 # coding=utf-8
2
3 import turtle
4 from datetime import *
5
6 # 抬起画笔,向前运动一段距离放下
7 def Skip(step):
8 turtle.penup()
9 turtle.forward(step)
10 turtle.pendown()
11
12 def mkHand(name, length):
13 # 注册Turtle形状,建立表针Turtle
14 turtle.reset()
15 Skip(-length * 0.1)
16 # 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。
17 turtle.begin_poly()
18 turtle.forward(length * 1.1)
19 # 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。
20 turtle.end_poly()
21 # 返回最后记录的多边形。
22 handForm = turtle.get_poly()
23 turtle.register_shape(name, handForm)
24
25 def Init():
26 global secHand, minHand, hurHand, printer
27 # 重置Turtle指向北
28 turtle.mode("logo")
29 # 建立三个表针Turtle并初始化
30 mkHand("secHand", 135)
31 mkHand("minHand", 125)
32 mkHand("hurHand", 90)
33 secHand = turtle.Turtle()
34 secHand.shape("secHand")
35 minHand = turtle.Turtle()
36 minHand.shape("minHand")
37 hurHand = turtle.Turtle()
38 hurHand.shape("hurHand")
39
40 for hand in secHand, minHand, hurHand:
41 hand.shapesize(1, 1, 3)
42 hand.speed(0)
43
44 # 建立输出文字Turtle
45 printer = turtle.Turtle()
46 # 隐藏画笔的turtle形状
47 printer.hideturtle()
48 printer.penup()
49
50 def SetupClock(radius):
51 # 建立表的外框
52 turtle.reset()
53 turtle.pensize(7)
54 for i in range(60):
55 Skip(radius)
56 if i % 5 == 0:
57 turtle.forward(20)
58 Skip(-radius - 20)
59
60 Skip(radius + 20)
61 if i == 0:
62 turtle.write(int(12), align="center", font=("Courier", 14, "bold"))
63 elif i == 30:
64 Skip(25)
65 turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
66 Skip(-25)
67 elif (i == 25 or i == 35):
68 Skip(20)
69 turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
70 Skip(-20)
71 else:
72 turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
73 Skip(-radius - 20)
74 else:
75 turtle.dot(5)
76 Skip(-radius)
77 turtle.right(6)
78
79 def Week(t):
80 week = ["星期一", "星期二", "星期三",
81 "星期四", "星期五", "星期六", "星期日"]
82 return week[t.weekday()]
83
84 def Date(t):
85 y = t.year
86 m = t.month
87 d = t.day
88 return "%s年%d月%d日" % (y, m, d)
89
90 def Tick():
91 # 绘制表针的动态显示
92 t = datetime.today()
93 second = t.second + t.microsecond * 0.000001
94 minute = t.minute + second / 60.0
95 hour = t.hour + minute / 60.0
96 secHand.setheading(6 * second)
97 minHand.setheading(6 * minute)
98 hurHand.setheading(30 * hour)
99
100 turtle.tracer(False)
101 printer.forward(65)
102 printer.write(Week(t), align="center",
103 font=("Courier", 14, "bold"))
104 printer.back(130)
105 printer.write(Date(t), align="center",
106 font=("Courier", 14, "bold"))
107 printer.home()
108 turtle.tracer(True)
109
110 # 100ms后继续调用tick
111 turtle.ontimer(Tick, 100)
112
113 def main():
114 # 打开/关闭龟动画,并为更新图纸设置延迟。
115 turtle.tracer(False)
116 Init()
117 SetupClock(160)
118 turtle.tracer(True)
119 Tick()
120 turtle.mainloop()
121
122 if __name__ == "__main__":
123 main()

最新文章

  1. eaby技术架构变迁
  2. soap和wsdl的定义
  3. addcontentView之后如何让这个view消失掉
  4. 关于ios中的文本操作-简介
  5. Demo学习: CalendarPanel
  6. vi文本编辑器
  7. Django1.7官方文档中的tutorial——翻译
  8. left join 和 left outer join 的区别
  9. java复习-多线程
  10. Trie/Xor
  11. 使用STS时遇到的小“麻烦”
  12. POJ 3662 Telephone Lines【Dijkstra最短路+二分求解】
  13. word中正文分栏重新换页问题
  14. 「JavaScript面向对象编程指南」原型
  15. MQTT研究之EMQ:【EMQ之HTTP认证/访问控制】
  16. HTML 请求头,响应头和 HTTP状态码
  17. 如何将同一云服务下的虚拟机从经典部署模型迁移到 Azure Resource Manager
  18. Oracle入门第五天(上)——数据库对象之视图
  19. Proguard语法及常用proguard.cfg代码段
  20. HDU 2092 (将表达式变成一元二次方程形式)

热门文章

  1. linux curl 的用法指南
  2. Python:pyglet学习(1):想弄点3D,还发现了pyglet
  3. egg项目eslint不识别链式操作符的解决方法
  4. 【.NET6+WPF+Avalonia】开发支持跨平台的WPF应用程序以及基于ubuntu系统的演示
  5. 安装MYSQL8.0提示api-ms-win-crt-runtime-l1-1-0.dll 丢失
  6. python检查是否有缺失值(有用)以及list,array合并
  7. min_25 筛学习小记
  8. CF802O题解
  9. 商品模型:SPU、商品、SKU概念模型设计
  10. linux指令_张三