考虑到扩展性(比如如果要添加年月日的刷新),代码比较复杂,采用了面向对象的设计方式。
注:不闪屏刷新只是该模板可实现的一个功能,本代码旨在提供一个模板可以实现使用数码管显示的各种场景
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()