from turtle import * from datetime import * import time '''主要的思想就是海龟作图,然后用一个循环去刷新一帧图像 但是因为应用了比较复杂的数码管图像,每一帧刷新延迟会比较严重 所以引入了多只乌龟来进行刷新,同时控制不同乌龟的刷新速度,来优化程序 ''' def skip(t:Turtle,step=5): # 这里定义了一个新的turtle操作,跳跃,默认画出小间隔 # 确保之后小乌龟都是以pendown,然后白的靠跳 t.penup() t.forward(step) t.pendown() def digital_tuber(ignitor,t:Turtle): # 画出一个数码管(6边形),但是不注册它,颜色由外部控制 # 小乌龟会在自己面朝的方向(正中)上画出一个数码管 temp = t.pensize() t.pensize(2) skip(t) if ignitor: # ignitor用于控制是否进行画图,不然就是空白管 t.pendown() t.begin_fill() t.begin_poly() for i in range(2): t.left(30) t.forward(5) t.right(30) t.forward(32) t.right(30) t.forward(5) t.right(150) t.end_poly() t.end_fill() skip(t,40) else: skip(t,40) skip(t) t.pensize(temp) # 还原 def digital_maker(digit:int,t:Turtle): # 画出数码管构成数字,然后在每次显示的时候对一个图像刷新 # 用一个函数来实现所有数字 t.left(90) # 因为我们采取的是默认的模式,而不是logo t.pendown() # 画出管的实现 digital_tuber(True,t) if digit in [0, 1, 4, 5, 6, 8, 9] else digital_tuber(False,t) t.right(90) digital_tuber(True,t) if digit in [0, 2, 3, 5, 6, 7, 8, 9] else digital_tuber(False,t) t.right(90) digital_tuber(True,t) if digit in [0, 2, 3, 4, 7, 8, 9] else digital_tuber(False,t) digital_tuber(True,t) if digit in [0, 3, 4, 5, 6, 7, 8, 9] else digital_tuber(False,t) t.right(90) digital_tuber(True,t) if digit in [0, 2, 3, 5, 6, 8, 9] else digital_tuber(False,t) t.right(90) digital_tuber(True,t) if digit in [0, 1, 2, 6, 8,] else digital_tuber(False,t) t.right(90) digital_tuber(True,t) if digit in [2, 3, 4, 5, 6, 8, 9] else digital_tuber(False,t) def show_number(n:int,t:Turtle): # 用于画出数字 n = str(n) for i in n: digital_maker(int(i),t) skip(t,20) def setframe(): # 画出程序的外框,和文字 t = Turtle() t.hideturtle() # 框架的画出不参与刷新,所以我们不需要外部turtle t.begin_poly() t.pensize(10) t.penup() t.goto(-450,250) t.pendown() t.goto(450,250) t.goto(450,-250) t.goto(-450,-250) t.goto(-450,250) t.penup() t.end_poly() def drawDate(date,t:Turtle): # 日期处理,将我们得到的时间,如何以格式化输出 t.penup() t.pendown() t.pencolor("red") for i in date: if i == "-": t.write("年",font=("Arial",18,"normal")) t.pencolor("green") skip(t,40) elif i == "=": t.write("月",font=("Arial",18,"normal")) t.pencolor("blue") skip(t,40) elif i == "+": t.write("日",font=("Arial",18,"normal")) elif i == ":": t.write(":", font=("Arial", 36, "normal")) skip(t,40) else: show_number(eval(i),t) # 将这个字符串作为eval的参数,eval的返回值就是这个表达式的结果 def show_date(t:Turtle): t.reset() t.penup() t.goto(-325,100) t.pendown() # 用time模组得时间 drawDate(time.strftime("%Y-%m=%d+",time.gmtime()),t) def show_hours(t:Turtle): # 画出下方的精确时间的函数 t.reset() t.penup() t.goto(-275, -100) t.pendown() temp = datetime.today() h = temp.hour m = temp.minute s = temp.second # 确保是两位数的格式 if h <= 9: h = '0'+str(h) else: h = str(h) if m <= 9: m = '0' + str(m) else: m = str(m) if s <= 9: s = '0' + str(s) else: s = str(s) drawDate(h+':'+m+':'+s,t) def defaultsetter(): # 用于初始化我们的画图体系 global dater, framer # 在重置阶段就申明好乌龟,就不要多次申明了 # 实际上我想做的优化就是让许多只小乌龟去画,就可以减少刷心负担 tracer(0) screensize(1000, 600) framer = Turtle() framer.hideturtle() dater = Turtle() dater.hideturtle() def resh_hour(): # 两个大函数的递归调用,为了区别刷新频率 dater.reset() show_hours(dater) ontimer(resh_hour,1000) # 刷新基础时间,间隔为一秒 def resh_date(): framer.reset() show_date(framer) ontimer(resh_date,10000) # 刷新日期时间,间隔为10秒 def main(): defaultsetter() setframe() resh_date() resh_hour() mainloop() if __name__ == '__main__': main()
以上就是啦