Python通過(guò)類(lèi)的組合模擬街道紅綠燈
一,紅綠燈揭示板案例思路
1. 創(chuàng)建Traffic_light紅綠燈類(lèi)
(1)靜態(tài)屬性 :
<1> 綠燈時(shí)間,<2> 黃燈時(shí)間 , <3> 紅燈時(shí)間, <4> 兩塊顯示時(shí)間的電子屏
(2)動(dòng)態(tài)屬性
<1> 輸入紅黃綠時(shí)間函數(shù)(靜態(tài)函數(shù)),<2> 紅黃綠時(shí)間倒計(jì)時(shí)函數(shù) ,
<3> 構(gòu)造電子屏數(shù)字的顯示函數(shù),<4> 顯示兩塊電子屏綁定兩位數(shù)的顯示函數(shù)
<5> 實(shí)例化對(duì)象展示電子屏函數(shù)
2. 電子屏類(lèi)的創(chuàng)建(Light):
python中沒(méi)有數(shù)組,因此自己創(chuàng)建函數(shù)把獲取到的值存放到數(shù)組中
(存放內(nèi)容: 20行,10列的布爾值)
3. input_time(color:str)函數(shù)的創(chuàng)建
<1> 導(dǎo)入colorama包并初始化實(shí)現(xiàn)windows命令行下顏色字體打印效果
<2> 輸入紅黃綠時(shí)間的字體成對(duì)應(yīng)的顏色
<3> 通過(guò)colorama類(lèi)方法實(shí)現(xiàn)輸入的紅黃綠時(shí)間為對(duì)應(yīng)的顏色展示
<4> 對(duì)輸入的數(shù)字進(jìn)行校驗(yàn)(必須為1-99之間的正數(shù)。因?yàn)橐粔K電子屏只記錄一位數(shù)字)
<5> 返回相應(yīng)的值
4. Countdown數(shù)字倒計(jì)時(shí)函數(shù)的創(chuàng)建
<1> 通過(guò)while循環(huán)讓三個(gè)燈的狀態(tài)一直循環(huán)持續(xù)
<2> 對(duì)于紅黃綠燈輸入的數(shù)字進(jìn)行遞減打印流程如下
#流程: 清屏-->打印完后 -->暫停1秒鐘-->清屏 -->數(shù)字減一后再打印-->再暫停1秒鐘-->清屏-->再數(shù)字減一打印
<3> 導(dǎo)入time,os,colorama等需要的包
5.build_LED_number函數(shù)的創(chuàng)建
之前創(chuàng)建的電子屏是默認(rèn)False的狀態(tài)。分別構(gòu)造0-9的狀態(tài)在電子屏中True的狀態(tài)的顯示
6.print_LED函數(shù)的創(chuàng)建
兩塊電子屏,分別顯示輸入時(shí)間的第一位和第二位數(shù)字.如果數(shù)字為單數(shù)則前面用零補(bǔ)齊的方法顯示。兩塊屏并排顯示每一位數(shù)字,從而展示電子版的效果
7.注意事項(xiàng):
因?yàn)槲覀冇玫搅薿s,及colorama類(lèi)。所以最終效果的展示不是在pycharm中展示。而是在windows的cmd命令行中展示。
原因是因?yàn)槲覀兇a中調(diào)用了os.system("cls")這個(gè)清屏命令。在pycharm中是很難做到清屏的效果。
另外在pycharm中對(duì)于電子屏的展示效果也不如windows cmd中展示的效果俱佳。因此運(yùn)行程序是請(qǐng)?jiān)趙indows命令行中運(yùn)行。
二,紅綠燈揭示板代碼的呈現(xiàn)
import time
import os
from colorama import init,Fore,Back,Style
#命令行模式字體顏色初始化
init(autoreset=True)
#電子屏類(lèi)
class Light:
#構(gòu)造函數(shù)
def __init__(self):
self.light = [] #存儲(chǔ)行列數(shù)組的集合
#自動(dòng)初始化
self.prepare_light()
def prepare_light(self):
"""
電子屏的創(chuàng)建
python中沒(méi)有數(shù)組.因此通過(guò)類(lèi),函數(shù)來(lái)創(chuàng)建數(shù)組得到一個(gè)20行10列的數(shù)組
:return:
"""
for row in range(20): #20行
temp = [] # 臨時(shí)存儲(chǔ)每行10個(gè)圈
for col in range(10): #10列
temp.append(False) #默認(rèn)燈都是不亮的因此通過(guò)布爾類(lèi)型的False表示不亮的狀態(tài)
#把行列排的200個(gè)燈的狀態(tài)存入到light集合中
self.light.append(temp)
#紅綠燈類(lèi)
class Traffic_light:
#構(gòu)造函數(shù),靜態(tài)屬性
def __init__(self,green_time,yellow_time,rea_time):
self.green_time = green_time #綠燈時(shí)間
self.yellow_time = yellow_time #黃燈時(shí)間
self.red_time = rea_time #紅燈時(shí)間
#通過(guò)類(lèi)的組合調(diào)用Light類(lèi)函數(shù)
self.number01 = Light() #創(chuàng)建第一個(gè)電子屏
self.number02 = Light() #創(chuàng)建第二個(gè)電子屏
#紅黃綠等時(shí)間倒計(jì)時(shí)函數(shù)
def countdown(self):
while True:
#流程: 清屏-->打印完后 -->暫停1秒鐘-->清屏 -->數(shù)字減一后再打印-->再暫停1秒鐘-->清屏-->再數(shù)字減一打印
for number in range(self.green_time,-1,-1):
#第一個(gè)-1代表取值到0,如果設(shè)置0則取值取不到0.第二個(gè)-1代表數(shù)字減一
os.system("cls") #清屏
self.start_display(number,"green") #調(diào)用start_display函數(shù)傳數(shù)字及顏色
time.sleep(1) #停止一秒鐘
# 黃燈倒計(jì)時(shí)
for number in range(self.yellow_time,-1,-1):
os.system("cls") #清屏
self.start_display(number,"yellow")
time.sleep(1) #停止一秒鐘
# 紅燈倒計(jì)時(shí)
for number in range(self.red_time,-1,-1):#第一個(gè)-1代表取值到0,如果設(shè)置0則取值取不到0.第二個(gè)-1代表數(shù)字減一
os.system("cls") #清屏
self.start_display(number,"red")
time.sleep(1) #停止一秒鐘
@staticmethod #靜態(tài)方法不需要初始化
def input_time(color:str):
# 設(shè)置全局變量(便于靜態(tài)方法使用)
time = ""
while True:
if color.lower() in ["green","綠色","綠","綠燈"]:
print(Fore.GREEN + "請(qǐng)輸入綠燈的時(shí)間:",end="") #實(shí)現(xiàn)打印字體呈現(xiàn)顏色效果
time = input()
if color.lower() in ["yellow", "黃色", "黃", "黃燈"]:
print(Fore.YELLOW + "請(qǐng)輸入黃燈的時(shí)間:", end="")
time = input()
if color.lower() in ["red", "紅色", "紅", "紅燈"]:
print(Fore.RED + "請(qǐng)輸入紅燈的時(shí)間:", end="")
time = input()
#校驗(yàn)輸入的是否合規(guī)
if not time.isdigit():
print("輸入的值不符合要求?!疽?必須是1-99之間的正數(shù)?!?)
continue
else:
time_number = int(time) # 因?yàn)閠ime是字符串.拿到數(shù)字后轉(zhuǎn)成Int類(lèi)型再判斷
if time_number < 1 or time_number > 99:
print("輸入的值不符合要求?!疽?必須是1-99之間的正數(shù)?!?)
continue
else:
return time_number
def build_LED_number(self,char:str):
"""
:param char: LED燈數(shù)字的構(gòu)造
:return: 返回temp_LED這個(gè)數(shù)組
"""
temp_LED = Light() #臨時(shí)創(chuàng)建新的數(shù)組
if char == "0": #構(gòu)造0
for row in range(20):
for col in range(10):
if row < 2: #最上面兩列
temp_LED.light[row][col] = True
if row > 17: #最下面兩列
temp_LED.light[row][col] = True
if col < 2:#最左邊兩列
temp_LED.light[row][col] = True
if col > 7: #最后面兩列
temp_LED.light[row][col] = True
elif char == "1": #構(gòu)造1
for row in range(20):
for col in range(10):
if col > 7: #最后面兩列
temp_LED.light[row][col] = True
elif char == "2": #構(gòu)造2
for row in range(20):
for col in range(10):
if row < 2: # 最上面兩列
temp_LED.light[row][col] = True
if col > 7 and row < 9: # 最后面兩列
temp_LED.light[row][col] = True
if row == 9 or row == 10: # 中間兩行
temp_LED.light[row][col] = True
if col < 2 and row >10: #左邊列
temp_LED.light[row][col] = True
if row > 17: # 最下面兩列
temp_LED.light[row][col] = True
elif char == "3": #構(gòu)造3
for row in range(20):
for col in range(10):
if row < 2: # 最上面兩列
temp_LED.light[row][col] = True
if col > 7 : # 最后面兩列
temp_LED.light[row][col] = True
if row == 9 or row == 10: # 中間兩行
temp_LED.light[row][col] = True
if row > 17: # 最下面兩列
temp_LED.light[row][col] = True
elif char == "4": # 構(gòu)造4
for row in range(20):
for col in range(10):
if col < 2 and row <9: # 最上面兩列
temp_LED.light[row][col] = True
if col > 7: # 最后面兩列
temp_LED.light[row][col] = True
if row == 9 or row == 10: # 中間兩行
temp_LED.light[row][col] = True
elif char == "5": # 構(gòu)造5
for row in range(20):
for col in range(10):
if row < 2:
temp_LED.light[row][col] = True
if col < 2 and row < 9:
temp_LED.light[row][col] = True
if row == 9 or row == 10:
temp_LED.light[row][col] = True
if col > 7 and row > 10:
temp_LED.light[row][col] = True
if row > 17:
temp_LED.light[row][col] = True
elif char == "6": # 構(gòu)造6
for row in range(20):
for col in range(10):
if row < 2:
temp_LED.light[row][col] = True
if col < 2:
temp_LED.light[row][col] = True
if row == 9 or row == 10:
temp_LED.light[row][col] = True
if col > 7 and row > 10:
temp_LED.light[row][col] = True
if row > 17:
temp_LED.light[row][col] = True
elif char == "7": # 構(gòu)造7
for row in range(20):
for col in range(10):
if row < 2:
temp_LED.light[row][col] = True
if col > 7:
temp_LED.light[row][col] = True
elif char == "8": #構(gòu)造8
for row in range(20):
for col in range(10):
if row < 2: #最上面兩列
temp_LED.light[row][col] = True
if row > 17: #最下面兩列
temp_LED.light[row][col] = True
if row == 9 or row == 10: # 中間兩行
temp_LED.light[row][col] = True
if col < 2:#最左邊兩列
temp_LED.light[row][col] = True
if col > 7: #最后面兩列
temp_LED.light[row][col] = True
elif char == "9": # 構(gòu)造9
for row in range(20):
for col in range(10):
if row < 2: # 最上面兩列
temp_LED.light[row][col] = True
if col < 2 and row < 9:
temp_LED.light[row][col] = True
if row > 17: # 最下面兩列
temp_LED.light[row][col] = True
if row == 9 or row == 10: # 中間兩行
temp_LED.light[row][col] = True
if col > 7: # 最后面兩列
temp_LED.light[row][col] = True
#返回值
return temp_LED
def print_LED(self,color:str):
for row in range(20):
#打印第一個(gè)數(shù)
for col01 in range(10):
if self.number01.light[row][col01] == True:
if color == "green":
print(Fore.GREEN + "●",end="")
elif color == "yellow":
print(Fore.YELLOW + "●",end="")
elif color == "red":
print(Fore.RED + "●",end="")
else:
print(" ",end="") # 兩個(gè)全角空格 注釋:○占用的字符相當(dāng)于兩個(gè)全角空格的占位
print("\t",end="")
#打印第二個(gè)數(shù)
for col02 in range(10):
if self.number02.light[row][col02] == True:
if color == "green":
print(Fore.GREEN + "●",end="")
elif color == "yellow":
print(Fore.YELLOW + "●",end="")
elif color == "red":
print(Fore.RED + "●",end="")
else:
print(" ",end="")
#換行
print()
def start_display(self,number:int,color:str):
"""
電子屏展示
:param number:電子屏上展示的數(shù)字
:param color: 電子屏上展示的顏色
:return:
"""
number_str = "%02d" % number #傳進(jìn)來(lái)的數(shù)字2位顯示
self.number01 = self.build_LED_number(number_str[0]) #把數(shù)字的第一位給第一個(gè)電子屏
self.number02 = self.build_LED_number(number_str[1]) #把數(shù)字的第二位給第二個(gè)電子屏
#在電子屏上顯示
self.print_LED(color)
if __name__ == "__main__":
green_time = Traffic_light.input_time("綠燈")
yellow_time = Traffic_light.input_time("黃燈")
red_time = Traffic_light.input_time("紅燈")
#實(shí)例化
traffic01 = Traffic_light(green_time,yellow_time,red_time)
traffic01.countdown()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python opencv 圖像邊框(填充)添加及圖像混合的實(shí)現(xiàn)方法(末尾實(shí)現(xiàn)類(lèi)似幻燈片漸變的效果)
- python實(shí)現(xiàn)向ppt文件里插入新幻燈片頁(yè)面的方法
- Python基本類(lèi)型的連接組合和互相轉(zhuǎn)換方式(13種)
- Python面向?qū)ο蟪绦蛟O(shè)計(jì)OOP深入分析【構(gòu)造函數(shù),組合類(lèi),工具類(lèi)等】
- Python面向?qū)ο箢?lèi)繼承和組合實(shí)例分析
- Python 如何查找特定類(lèi)型文件
- 解析python 類(lèi)方法、對(duì)象方法、靜態(tài)方法
- 詳解python metaclass(元類(lèi))
- python字典key不能是可以是啥類(lèi)型
相關(guān)文章
Python計(jì)算一個(gè)點(diǎn)到所有點(diǎn)的歐式距離實(shí)現(xiàn)方法
今天小編就為大家分享一篇Python計(jì)算一個(gè)點(diǎn)到所有點(diǎn)的歐式距離實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
對(duì)Python中列表和數(shù)組的賦值,淺拷貝和深拷貝的實(shí)例講解
今天小編就為大家分享一篇對(duì)Python中列表和數(shù)組的賦值,淺拷貝和深拷貝的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
實(shí)例說(shuō)明Python中比較運(yùn)算符的使用
這篇文章主要介紹了=Python中比較運(yùn)算符的使用,是Python學(xué)習(xí)當(dāng)中的基本知識(shí),需要的朋友可以參考下2015-05-05
Python實(shí)現(xiàn)發(fā)送郵件到自己郵箱
在日常開(kāi)發(fā)中,我們經(jīng)常需要監(jiān)控應(yīng)用程序的狀態(tài),及時(shí)發(fā)現(xiàn)問(wèn)題并采取措施解決。而通過(guò)郵件發(fā)送報(bào)警信息則是一種常見(jiàn)的實(shí)現(xiàn)方式。本文就來(lái)介紹一下Python實(shí)現(xiàn)發(fā)送郵件到自己郵箱的方法2023-04-04
python使用PySimpleGUI設(shè)置進(jìn)度條及控件使用
PySimpleGUI是一個(gè)在tkinter基礎(chǔ)上的,足夠簡(jiǎn)單,方便,pythonic的GUI庫(kù).本文給大家介紹python使用PySimpleGUI設(shè)置進(jìn)度條的方法及進(jìn)度條控件使用代碼,感興趣的朋友跟隨小編一起看看吧2021-06-06
python實(shí)現(xiàn)在pickling的時(shí)候壓縮的方法
這篇文章主要介紹了python實(shí)現(xiàn)在pickling的時(shí)候壓縮的方法,比較具有實(shí)用價(jià)值,需要的朋友可以參考下2014-09-09
對(duì)numpy中array和asarray的區(qū)別詳解
下面小編就為大家分享一篇對(duì)numpy中array和asarray的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04

