例項7:七段數碼管繪製
阿新 • • 發佈:2021-01-17
問題描述:
-
請用程式繪製當前系統時間對應的七段數碼管,效果如下:
-
使用 time 庫獲得系統當前時間,格式如下:20190411
-
繪製對應的七段數碼管
-
數碼管風格不限
思路分析:
- 我們既然想繪製以上8個七段數碼管,那麼我們就要先繪製一個七段數碼管,想要繪製一個七段數碼管,就要先繪製一條線(一個七段數碼管是有七條線組成的)
- 像這樣我們把一個大問題分解成幾個小問題,遞進式的解決它們,在以後的問題分析中是十分常見的.
- 進而考慮繪製一條線:由於數字不同,七條線中的每一條線亮暗也就不同,也就是說一條線有兩種狀態:亮 暗
- 我們可以編寫一個函式來繪製一條線並且給它一個狀態值設定它的狀態.
- 為了繪製出七段數碼管,我們首先要顯示出一段數碼管,如下,可以嘗試把這些線段是有順序(按1到7的順序)畫出的。
先試著畫出一條線段
import turtle
def drawLine(draw):
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
turtle.right(90)
return
- 好了,現在可以反覆呼叫這個函式來畫出七段數碼管了。注意我們用數字來控制每段數碼管亮、暗狀態,以此來繪製出一個數字
- 線段1亮狀態,對應的數字為2、3、4、5、6、8、9
- 線段2亮狀態,對應的數字為3、4、5、6、7、8、9
- 線段3亮狀態,對應的數字為2、3、5、6、8
- 線段4亮狀態,對應的數字為2、6、8
- 線段5亮狀態,對應的數字為4、5、6、8、9
- 線段6亮狀態,對應的數字為2、3、5、6、7、8、9
- 線段7亮狀態,對應的數字為2、3、4、7、8、9
def drawDigit(digit): # 數字0-9對應的七段數碼管的繪製
drawLine(True) if digit in [2, 3, 4, 5, 6, 8, 9] else drawLine(False) # 線段1
drawLine(True) if digit in [3, 4, 5, 6, 7, 8, 9] else drawLine(False) # 線段2
drawLine(True) if digit in [2, 3, 5, 6, 8] else drawLine(False) # 線段3
drawLine(True) if digit in [2, 6, 8] else drawLine(False)
turtle.left(90) # 線段4,在畫完線段4後,海龜右轉了90°,朝向了0°方向,需要把方向調整,使其能順利畫出線段5
drawLine(True) if digit in [4, 5, 6, 8, 9] else drawLine(False) # 線段5
drawLine(True) if digit in [2, 3, 5, 6, 7, 8, 9] else drawLine(False) # 線段6
drawLine(True) if digit in [2, 3, 4, 7, 8, 9] else drawLine(False) # 線段7
turtle.left(180) # 畫完線段7後,海龜右轉了90°,朝向了x軸負方向,需要把方向調整為x軸正方向,使其能進行下一個數的繪製
turtle.penup()
turtle.fd(20) #畫筆抬起,向前走20畫素,確定每個數字的間隔
- 一個數字能繪製出來了,那麼一串數字也能繪製出來
def drawDate(date):
for i in date:
drawLine(eval(i))
- 現在用主函式來設定一下執行的程式
def main():
turtle.setup(800, 600)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawDate("20210116")
turtle.hideturtle()
turtle.done()
main()
- 這樣我們得到的是一個設定好的日期。現在我們把問題優化一下,用time模組中的gmtime()函式來獲取系統當前時間,用strftime()將獲取到的系統時間格式化為"%Y-%m=%d+"的形式
- 在drawDate()函式中,我們把相關年月日問題再優化一下
def drawDate(date):
turtle.pencolor("red")
for i in date:
if i == "-":
turtle.write("年", font=("Arial", 18, "normal"))
turtle.pencolor("green")
turtle.fd(40)
elif i == "=":
turtle.write("月", font=("Arial", 18, "normal"))
turtle.pencolor("blue")
turtle.fd(40)
elif i == "+":
turtle.write("日", font=("Arial", 18, "normal"))
else:
drawDigit(eval(i))
主函式修改為:
def main():
turtle.setup(800, 600)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawDate(time.strf("%Y-%m=%d+",time.gmtime()))
turtle.hideturtle()
turtle.done()
main()
而為了增加美感,我們在每段線段的起始和末尾處都增加一小段間隔
def drawGap():
turtle.penup()
turtle.fd(5)
def drawLine(draw):
drawGap()
...略...
drawGap()
turtle.right(90)
return
最終,程式碼為:
# 繪製七段數碼管
import turtle as t
import time
def drawGap(): # 繪製數碼管間隔的函式
t.penup()
t.fd(5)
def drawLine(draw): # 單個線段的繪製
drawGap() # 線上段繪製前,分隔一段距離
t.pendown() if draw else t.penup()
t.fd(40)
drawGap() # 線上段繪製後,分隔一段距離
t.right(90)
return
def drawDigit(digit): # 數字0-9對應的七段數碼管的繪製
drawLine(True) if digit in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if digit in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False)
drawLine(True) if digit in [0, 2, 3, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if digit in [0, 2, 6, 8] else drawLine(False)
t.left(90)
drawLine(True) if digit in [0, 4, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if digit in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False)
drawLine(True) if digit in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False)
t.left(180)
t.penup()
t.fd(20)
def drawDate(date): # 給定日期轉化為數字,畫出每個數字
t.pencolor("red")
for i in date:
if i == "-":
t.write("年", font=("Arial", 18, "normal"))
t.pencolor("green")
t.fd(40)
elif i == "=":
t.write("月", font=("Arial", 18, "normal"))
t.pencolor("blue")
t.fd(40)
elif i == "+":
t.write("日", font=("Arial", 18, "normal"))
else:
drawDigit(eval(i))
def main():
t.setup(800, 500, 200, 200)
t.penup()
t.fd(-300)
t.pensize(5)
drawDate(time.strftime("%Y-%m=%d+", time.gmtime()))
t.hideturtle()
t.done()
main()
輸出效果: