此程序模擬多級菜單操做,實現按菜單項對應數字索引進入下級菜單,按b鍵回退到上一級菜單,按q鍵退出菜單。並用一個簡化的學科專業目錄進行了三級菜單測試,實際上此程序可適用任意多級菜單操做。python
本程序採用python語言編寫,爲了高效實現菜單操做,減小循環次數,關鍵定義了以下三個變量:git
current_menu_dict
:非最低級菜單時爲一個嵌套字典,在最低級菜單時爲一個列表,存放當前級及後續各級菜單。upper_menu_list
:一個列表,存放比當前級更高級別的全部菜單嵌套字典的列表,最後一個元素比current_menu_dict多一層父菜單。temp_menu
:一個列表,只存放當前級的菜單,即爲current_menu_dict
的鍵值。菜單操做過程:
(1)按數字鍵進入對應的下級菜單:數字鍵是temp_menu
的索引,根據索引提取當前菜單項,即爲current_menu_dict
的一個鍵值,據此current_menu_dict
可從新指向該鍵值對應的下一級菜單嵌套字典,不過在進入下級菜單以前,upper_menu_list.append(current_menu_dict)
先把當前菜單嵌套字典添加爲upper_menu_list
的最後一個元素,爲回退作準備。
(2)按b鍵回退到上一級菜單:回退時current_menu_dict=upper_menu_list.pop()
獲取上一級菜單嵌套字典,實現回退。
(3)按q鍵退出菜單:按q鍵時調用exit()
退出程序。app
簡例示意:假設三級菜單字典爲{一級菜單:{二級菜單:三級菜單}}
,若是當前菜單在第二級,此時 current_menu_dict={二級菜單:三級菜單}
upper_menu_list=[{一級菜單:{二級菜單:三級菜單}}]
temp_menu=[二級菜單]
ide
1 # Author:Byron Li 2 3 menu_data={ 4 '文學': 5 { 6 '中國語言文學':['語言學及應用語言學','漢語言文字學','中國古代文學','中國現當代文學'], 7 '外國語言文學':['英語語言文學','亞非語言文學','阿拉伯語語言文學','外國語言學及應用語言學'], 8 '新聞傳播學': ['新聞學', '傳播學'], 9 '藝術學': ['音樂學', '美術學','戲劇戲曲學','電影學','舞蹈學'] 10 }, 11 12 '理學': 13 { 14 '數學':['基礎數學','計算數學','機率論與數理統計','應用數學','運籌學與控制論'], 15 '物理學':['理論物理','粒子物理與原子核物理','原子與分子物理','等離子體物理','無線電物理'], 16 '化學': ['無機化學','分析化學','有機化學','物理化學','高分子化學與物理'], 17 '生物學': ['植物學', '動物學','生理學','微生物學','遺傳學'], 18 '地球物理學': ['固體地球物理學', '空間物理學'] 19 }, 20 '工學': 21 { 22 '機械工程':['機械製造及其自動化','機械電子工程','機械設計及理論','車輛工程'], 23 '電氣工程':['電力系統及其自動化','高電壓與絕緣技術','電力電子與電力傳動','電工理論與新技術'], 24 '計算機科學與技術': ['計算機系統結構','計算機軟件與理論','計算機應用技術'], 25 '土木工程': ['岩土工程', '結構工程','市政工程','防災減災工程及防禦工程','橋樑與隧道工程'], 26 '地質資源與地質工程': ['礦產普查與勘探', '地球探測與信息技術','地質工程'] 27 } 28 } 29 30 current_menu_dict=menu_data #存放當前級及後續各級菜單的嵌套字典,在最低級時爲一個列表 31 upper_menu_list=[] #存放比當前級更高級別的全部菜單字典的列表,最後一個元素比current_menu_dict多一層父菜單 32 temp_menu=[] #存放當前級菜單的一個臨時列表 33 34 while(True): 35 for i,subject in enumerate(current_menu_dict): #循環顯示出當前菜單的索引和菜單項 36 if type(current_menu_dict) == dict: #若是當前菜單不是最低一級菜單,則顯示索引和菜單項 37 print(''.join(['\t'*len(upper_menu_list),'[',str(i),']',subject])) 38 39 else: #若是當前菜單是最低一級菜單則只顯示菜單項,不顯示索引 40 print(''.join(['\t'*len(upper_menu_list),subject])) 41 temp_menu.append(subject) 42 43 choice=input(''.join(['\t'*len(upper_menu_list),'>>>'])) #輸入選項 44 if choice.isdigit(): #若是輸入選項是菜單項對應的數字索引,則進入該菜單項下一級菜單 45 if type(current_menu_dict) == dict: #若是當前菜單不是最低一級菜單,則經過輸入數字索引進入對應菜單項的下一級菜單 46 index = int(choice) 47 if index >= 0 and index < len(temp_menu): 48 key = temp_menu[index] 49 upper_menu_list.append(current_menu_dict) #若是輸入數字包含在菜單項索引中,則高級別菜單列表添加當前菜單爲其最後一個元素,而當前菜單進入索引對應的下一級菜單 50 current_menu_dict = current_menu_dict[key] 51 else: 52 print('輸入錯誤數字,請從新輸入!') 53 else: 54 print('已經是最低級菜單,按b鍵退回上級菜單,按q鍵退出!') 55 elif choice=='b': #若是輸入選項是"b",則退回到上一級菜單 56 if len(upper_menu_list) > 0: #若是當前菜單不是最高級菜單,取高級別菜單列表中的最後一個元素爲當前菜單字典 57 current_menu_dict=upper_menu_list.pop() 58 else: #若是當前菜單已經是最高級菜單,不能回退 59 print('已經是最高級菜單,不能回退,按數字鍵選擇菜單項進入子菜單,按q鍵退出') 60 elif choice=='q': #若是輸入選項是"q",則退出菜單 61 print('退出菜單!'.center(50,'*')) 62 exit() 63 else: 64 print('輸入錯誤,請從新輸入') 65 temp_menu=[]