Python:七段数码管时钟的不闪屏刷新

考虑到扩展性(比如如果要添加年月日的刷新),代码比较复杂,采用了面向对象的设计方式。

注:不闪屏刷新只是该模板可实现的一个功能,本代码旨在提供一个模板可以实现使用数码管显示的各种场景

import turtle
import time
class Transistor:
    length=50
    gap=5
    width=length+2*gap
    def __init__(self,x,y,val,tr=None):
        turtle.penup()
        turtle.tracer(False)
        turtle.goto(x,y)
        turtle.tracer(True)
        self.x=x
        self.y=y
        self.val=val
        self.tr=[0,0,0,0,0,0,0]
        if val == 0:
            self.tr[1]=self.tr[2]=self.tr[3]=self.tr[4]=self.tr[5]=self.tr[6]=1
        elif val == 1:  
            self.tr[1]=self.tr[6]=1
        elif val == 2:
            self.tr[0]=self.tr[1]=self.tr[2]=self.tr[4]=self.tr[5]=1
        elif val == 3:
            self.tr[0]=self.tr[1]=self.tr[2]=self.tr[5]=self.tr[6]=1
        elif val == 4:
            self.tr[0]=self.tr[1]=self.tr[3]=self.tr[6]=1
        elif val == 5:
            self.tr[0]=self.tr[2]=self.tr[3]=self.tr[5]=self.tr[6]=1
        elif val == 6:
            self.tr[0]=self.tr[2]=self.tr[3]=self.tr[4]=self.tr[5]=self.tr[6]=1
        elif val == 7:
            self.tr[1]=self.tr[2]=self.tr[6]=1
        elif val == 8:
            self.tr[0]=self.tr[1]=self.tr[2]=self.tr[3]=self.tr[4]=self.tr[5]=self.tr[6]=1
        elif val == 9:
            self.tr[0]=self.tr[1]=self.tr[2]=self.tr[3]=self.tr[5]=self.tr[6]=1
            
    def DrawOperation(self):
        turtle.pendown()
        turtle.fd(self.length)
        turtle.penup()
        
    def TurnOnTransistor(self,val):
        if val ==0:
            turtle.goto(self.x+self.gap,self.y)
            turtle.seth(0)
            self.DrawOperation()
        elif val ==1:
            turtle.goto(self.x+self.length+2*self.gap,self.y+self.length+self.gap)
            turtle.seth(-90)
            self.DrawOperation()
        elif val ==2:
            turtle.goto(self.x+self.length+self.gap,self.y+self.length+2*self.gap)
            turtle.seth(180)
            self.DrawOperation()
        elif val ==3:
            turtle.goto(self.x,self.y+self.gap)
            turtle.seth(90)
            self.DrawOperation()
        elif val ==4:
            turtle.goto(self.x,self.y-self.gap)
            turtle.seth(-90)
            self.DrawOperation()
        elif val ==5:
            turtle.goto(self.x+self.length+self.gap,self.y-self.length-2*self.gap)
            turtle.seth(180)
            self.DrawOperation()
        elif val ==6:
            turtle.goto(self.x+self.length+2*self.gap,self.y-self.length-self.gap)
            turtle.seth(90)
            self.DrawOperation()
            
    def TurnOffTransistor(self,val):
        turtle.pencolor(0.80,0.80,0.80)
        if val ==0:
            turtle.goto(self.x+self.gap,self.y)
            turtle.seth(0)
            self.DrawOperation()
        elif val ==1:
            turtle.goto(self.x+self.length+2*self.gap,self.y+self.length+self.gap)
            turtle.seth(-90)
            self.DrawOperation()
        elif val ==2:
            turtle.goto(self.x+self.length+self.gap,self.y+self.length+2*self.gap)
            turtle.seth(180)
            self.DrawOperation()
        elif val ==3:
            turtle.goto(self.x,self.y+self.gap)
            turtle.seth(90)
            self.DrawOperation()
        elif val ==4:
            turtle.goto(self.x,self.y-self.gap)
            turtle.seth(-90)
            self.DrawOperation()
        elif val ==5:
            turtle.goto(self.x+self.length+self.gap,self.y-self.length-2*self.gap)
            turtle.seth(180)
            self.DrawOperation()
        elif val ==6:
            turtle.goto(self.x+self.length+2*self.gap,self.y-self.length-self.gap)
            turtle.seth(90)
            self.DrawOperation()
        turtle.pencolor("black")
        
    def ShowTransistor(self):
        for i in range(7):
            if self.tr[i]==1:
                self.TurnOnTransistor(i)
            else:
                self.TurnOffTransistor(i)
                          
    def RefreshTransistor(self,val):
        self.val=val
        a=Transistor(self.x,self.y,val)
        turtle.tracer(False)
        for i in range(7):
            if self.tr[i]==0 and a.tr[i]==1:
                self.TurnOnTransistor(i)
            elif self.tr[i]==1 and a.tr[i]==0:
                self.TurnOffTransistor(i)
        turtle.tracer(True)
        self.tr=a.tr   
        
class TransistorGroup:
    gap=20  #组间距
    def __init__(self,x,y,val,width=0,group=None):
        self.x=x
        self.y=y
        self.val=val
        self.width=width 
        self.group=[]
        if val>=10:
            ls=[]
            while val !=0:
                ls.append(val%10)
                val=val//10
            ls.reverse()
            for i in ls:
                self.group.append(Transistor(x,y,i))
                self.width+=Transistor.width+self.gap
                x=x+Transistor.width+self.gap
            self.width-=self.gap
            self.group.reverse()
        else:
            self.group.append(Transistor(x+Transistor.width+self.gap,y,val))
            self.group.append(Transistor(x,y,0))
            self.width=2*Transistor.width+self.gap
  
    def ShowTransistorGroup(self):
        for i in self.group:
            i.ShowTransistor()
            
    def RefreshTransistorGroup(self,val):
        self.val=val
        if val>=10:
            i=0
            while val !=0:
                if val%10!=self.group[i].val:
                    self.group[i].RefreshTransistor(val%10)
                val=val//10
                i=i+1
        else:
                if self.group[0].val!=val:
                    self.group[0].RefreshTransistor(val)
                if self.group[1].val!=0:
                    self.group[1].RefreshTransistor(0)

class DataTransistor:
    time_now=time.localtime(time.time())
    gap=40
    def __init__(self,x,y,hour=time_now.tm_hour,minute=time_now.tm_min,seconds=time_now.tm_sec):
        self.x=x
        self.y=y
        self.hour=TransistorGroup(self.x,self.y,hour)
        self.minute=TransistorGroup(self.hour.x+self.hour.width+self.gap,self.y,minute)
        self.seconds=TransistorGroup(self.minute.x+self.minute.width+self.gap,self.y,seconds)
    
    def DrawDot(self,x,y):
        turtle.goto(x,y)
        turtle.pendown()
        turtle.dot(self.gap//4)
        turtle.penup()
        
    def ShowData(self):
        turtle.tracer(False)
        self.hour.ShowTransistorGroup()
        self.DrawDot(self.hour.x+self.hour.width+self.gap//2,self.hour.y)
        self.DrawDot(self.hour.x+self.hour.width+self.gap//2,self.hour.y-Transistor.width)
        self.minute.ShowTransistorGroup()
        self.DrawDot(self.minute.x+self.minute.width+self.gap//2,self.hour.y)
        self.DrawDot(self.minute.x+self.minute.width+self.gap//2,self.hour.y-Transistor.width)
        self.seconds.ShowTransistorGroup()
        turtle.tracer(True)

    def DataRefresh(self):
        while True:
            min_add=False
            hour_add=False
            time.sleep(1)
            if self.seconds.val+1==60:
                self.seconds.RefreshTransistorGroup(0)
                min_add=True
            else:
                self.seconds.RefreshTransistorGroup(self.seconds.val+1)
            if min_add:
                if self.minute.val+1==60:
                    hour_add=True
                    self.minute.RefreshTransistorGroup(0)
                else:
                    self.minute.RefreshTransistorGroup(self.minute.val+1)
            if hour_add:
                if self.hour.val+1==24:
                    self.hour.RefreshTransistorGroup(0)
                else:
                    self.hour.RefreshTransistorGroup(self.hour.val+1)

turtle.hideturtle()
turtle.pensize(6)
a=DataTransistor(-250,0)
a.ShowData()
a.DataRefresh()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值