罗马数字动态时钟原理:将动态时钟看作一个圆,划作十二等分,每一等份放一个罗马数字。
import turtle as turtle
import datetime as datetime
def Skip(step):
turtle.penup()
turtle.forward(step)
turtle.pendown()
def stiak(name, length):
# 注册Turtle形状,建立表针Turtle
turtle.reset() # 清空当前窗口,并重置位置等信息为默认值
Skip(-length * 0.1)
turtle.begin_poly()
turtle.forward(length * 1.1)
turtle.end_poly()
turtle.handForm = turtle.get_poly()
turtle.register_shape(name, turtle.handForm)
def Init():
global secHand, minHand, hurHand, printer
turtle.mode("logo") # 重置Turtle指向北
# 建立三个表针Turtle并初始化
stiak("secHand", 135)
stiak("minHand", 110)
stiak("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()
printer.hideturtle()
printer.penup()
def SetupClock(radius):
# 建立表的外框
turtle.reset()
turtle.pensize(5)
# turtle.begin_fill()
# turtle.circle(100, extent=None, steps=None)
# turtle.end_fill()
list_f = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII']
for i in range(60):
Skip(radius)
if i % 5 == 0:
turtle.forward(30)
Skip(-radius - 20)
# 移动到刻度线终点
Skip(radius + 20)
#下面是写表盘刻度值,为了不与划线重叠,所以对于特殊位置做了处理
# if i == 0:
# turtle.write(list_f[11], align="center", font=("Courier", 14, "bold"))
# elif i == 30:
# Skip(25)
# turtle.write(list_f[i/5], align="center", font=("Courier", 14, "bold"))
# Skip(-25)
# elif (i == 25 or i == 35):
# Skip(20)
# turtle.write(list_f[i/5], align="center", font=("Courier", 14, "bold"))
# Skip(-20)
# else:
# turtle.write(list_f[i/5], align="center", font=("Courier", 14, "bold"))
# if i == 0:
# turtle.write(list_f[11], align="center", font=("Courier", 14, "bold"))
# elif i == 30:
# Skip(25)
# turtle.write(list_f[i/5], align="center", font=("Courier", 14, "bold"))
# Skip(-25)
# elif (i == 25 or i == 35):
# Skip(20)
# turtle.write(list_f[i/5], align="center", font=("Courier", 14, "bold"))
# Skip(-20)
# else:
# turtle.write(list_f[i/5], align="center", font=("Courier", 14, "bold"))
if i==0 or i==60:
df=list_f[11]
turtle.write(df)
elif i==5:
df=list_f[0]
turtle.write(df)
elif i==10:
df = list_f[1]
turtle.write(df)
elif i==15:
df=list_f[2]
turtle.write(df)
elif i==20:
df=list_f[3]
turtle.write(df)
elif i==25:
df=list_f[4]
turtle.write(df)
elif i==30:
df=list_f[5]
turtle.write(df)
elif i==35:
df=list_f[6]
turtle.write(df)
elif i==40:
df=list_f[7]
turtle.write(df)
elif i==45:
df=list_f[8]
turtle.write(df)
elif i==50:
df=list_f[9]
turtle.write(df)
elif i==55:
df=list_f[10]
turtle.write(df)
# turtle.write(list_f[1])
# turtle.write(list_f[2])
# turtle.write(list_f[3])
# turtle.write(list_f[4])
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.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) # 设置朝向,每秒转动6度
minHand.setheading(6 * minute)
hurHand.setheading(30 * hour)
turtle.tracer(True) # 不显示绘制的过程,直接显示绘制结果
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.back(50)
printer.write("稀德出品", align="center",
font=("Courier", 14, "bold"))
printer.home()
turtle.tracer(True)
turtle.ontimer(Tick, 1000) # 1000ms后继续调用tick
def main():
turtle.tracer(False) # 使多个绘制对象同时显示
Init()
SetupClock(160)
turtle.tracer(True)
Tick()
turtle.mainloop()
if __name__ == "__main__":
main()