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