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