python用海龟画出7段数码管时钟

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()

以上就是啦

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个示例程序,可以使用海龟绘制七段数码管,以显示实时时间: ```python import turtle import time # 数码管的宽度和高度 WIDTH = 20 HEIGHT = 50 # 数码管的线段坐标 SEGMENTS = [ [(0, 0), (0, HEIGHT)], [(0, HEIGHT), (WIDTH, HEIGHT)], [(WIDTH, HEIGHT), (WIDTH, HEIGHT // 2)], [(WIDTH, HEIGHT // 2), (0, HEIGHT // 2)], [(0, HEIGHT // 2), (0, 0)], [(0, 0), (WIDTH, 0)], [(WIDTH, 0), (WIDTH, HEIGHT // 2)] ] # 数字的七段编码 DIGITS = { "0": [1, 1, 1, 0, 1, 1, 1], "1": [0, 0, 1, 0, 0, 1, 0], "2": [1, 0, 1, 1, 1, 0, 1], "3": [1, 0, 1, 1, 0, 1, 1], "4": [0, 1, 1, 1, 0, 1, 0], "5": [1, 1, 0, 1, 0, 1, 1], "6": [1, 1, 0, 1, 1, 1, 1], "7": [1, 0, 1, 0, 0, 1, 0], "8": [1, 1, 1, 1, 1, 1, 1], "9": [1, 1, 1, 1, 0, 1, 1] } # 绘制一个数码管 def draw_segment(x, y, on=True): pen.penup() pen.goto(x, y) pen.pendown() if on: pen.fillcolor("red") else: pen.fillcolor("gray") pen.begin_fill() for segment in SEGMENTS: pen.goto(x + segment[0][0], y + segment[0][1]) pen.goto(x + segment[1][0], y + segment[1][1]) pen.end_fill() # 绘制一个数字 def draw_digit(x, y, digit): for i, on in enumerate(DIGITS[digit]): draw_segment(x, y + (6 - i) * HEIGHT, on) # 显示时间 def show_time(): pen.clear() t = time.strftime("%H:%M:%S") for i, digit in enumerate(t): draw_digit(i * (WIDTH + 10) - ((len(t) - 1) * (WIDTH + 10)) / 2, 0, digit) screen.update() # 每秒钟更新一次时间 screen.ontimer(show_time, 1000) # 创建布和笔 screen = turtle.Screen() screen.setup(600, 200) pen = turtle.Turtle() pen.hideturtle() pen.speed(0) pen.penup() # 显示时间 show_time() turtle.done() ``` 在这里,`SEGMENTS`是七段数码管的线段坐标。`DIGITS`是数字的七段编码。`draw_segment()`函数绘制一个数码管,`draw_digit()`函数绘制一个数字。`show_time()`函数使用`draw_digit()`函数绘制当前时间的每个数字。`screen.ontimer(show_time, 1000)`函数调度`show_time()`函数每秒钟更新一次时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值