閑着沒事,用python寫一個模擬通訊錄,要求要實現常用的通訊錄的功能,基本流程如下
接下來就按照這個流程實現各個模塊的功能
1. 定義一個類,並初始化
def __init__(self): with open("contact.txt", 'r', encoding='utf-8') as f: self.data = json.loads(f.read()) # 所有聯系人列表
2. 接下來先定義一個方法,實現通訊錄的主界面的功能
1 def main_menu(self): 2 # 主菜單(主頁面) 3 while True: 4 print('通訊錄'.center(20, '=')) 5 menu = {'1': '快速查找', 6 '2': '添加聯系人', 7 '3': '顯示所有聯系人'} 8 for k, v in menu.items(): 9 print(k + ' ' + v) 10 command = input('請選擇你的操作>>') 11 if command == '1': 12 self.search() 13 elif command == '2': 14 self.add_contact() 15 elif command == '3': 16 self.show() 17 elif command == 'q': 18 print('退出...') 19 break
調用該方法,就會顯示一個主界面,注:整個程序都有“返回”功能,操作命令是按"q"
用戶可以選擇“快速查找”(定義了一個search()方法來實現),“添加聯系人”(定義了一個add_address()方法實現),“顯示所有聯系人”(定義了一個show()方法來實現),然后根據用戶的輸入如,進入下一個子頁面
下面介紹這幾個方法的具體實現過程
- search()方法(通訊錄查找)
1 def search(self): 2 print('快速查找'.center(20, '=')) 3 # 可以根據聯系人名字查找,也可以根據電話號碼查找 4 find_info = input('請輸入查找信息>>') 5 count = 0 6 for i in range(len(self.data)): 7 if count > len(self.data): 8 print('未找到該聯系人') 9 break 10 if find_info in self.data[i]['name']: 11 self.person_info(self.data[i]) # 若有該聯系人,則進入聯系人個人信息頁 12 elif find_info in self.data[i]['phone_number']: 13 self.person_info(self.data[i]) # 若有該號碼,則進入聯系人個人信息頁 14 else: 15 pass 16 count += 1
該方法是根據用戶的輸入,查找到聯系人之后,返回聯系人信息。該方法提供兩種查找的方法,一種是根據備注名來查找,一種是根據電話號碼來查找,若找不到則提示用戶未找到,找到則跳轉到該聯系人的個人信息頁
- 上面這個方法里面嵌套了一個方法,person_info(),參數是查找到的聯系人的個人信息。這個方法的功能是展示某個聯系人的個人信息頁面,具體實現的過程如下
1 def person_info(self, info): 2 # 個人信息頁 3 # find_info 是該聯系人的信息字典 4 print('已為你找到:{}'.format(info['name'])) 5 menu = {'1': '查看個人信息', '2': '修改信息', '3': '刪除聯系人', '4': '呼叫聯系人', '5': '呼叫記錄'} 6 while True: 7 print('個人信息頁'.center(20, '=')) 8 for k, v in menu.items(): 9 print(k + ' ' + v) 10 command = input('請選擇操作>>') 11 if command == '1': 12 print('姓名:{}\n電話號碼:{}\n通話記錄:{}'.format(info['name'], 13 info['phone_number'], info['call_records'])) 14 elif command == '2': 15 self.modify_info(info) 16 elif command == '3': 17 self.del_contact(info) 18 break # 刪除聯系人之后,該聯系人的個人信息頁就沒了,所以就得跳回去 19 elif command == '4': 20 self.call(info) 21 elif command == '5': 22 self.call_logs(info) 23 elif command == 'q': 24 print('返回...') 25 break
如果正確進入該頁的話,將會看到下面這個界面
然后用戶可以根據提示,選擇你接下來的操作。根據代碼可以看到,從1到5,各個功能都分別定義了一個方法(函數)。下面來介紹一下這幾個方法的實現過程
- 修改信息
1 def modify_info(self, info): 2 # 修改聯系人信息 3 # info是該聯系人信息字典 4 if info in self.data: 5 self.data.remove(info) # 將所有聯系人的列表中的該聯系人刪除,等修改好之后再后在重新加進去,然后更新通訊錄 6 menu = {'1': '修改備注', '2': '修改號碼', '3': '刪除通話記錄'} 7 while True: 8 print('修改信息'.center(20, '=')) 9 for k, v in menu.items(): 10 print(k + ' ' + v) 11 command = input('請選擇操作>>') 12 if command == 'q': 13 print('返回...') 14 break 15 if command == '1': 16 info['name'] = input('請輸入備注>>') 17 elif command == '2': 18 info['phone_number'] = input('請輸入號碼>>') 19 elif command == '3': 20 info['call_records'] = [] 21 else: 22 continue 23 self.data.append(info) # 將修改過的該聯系人信息加入所有聯系人信息列表,以待更新通訊錄 24 # print(self.data) 25 self.update_contact() # 更新通訊錄 26 print('信息修改成功')
修改信息可以修改備注、號碼、刪除通話記錄(因為通話記錄可以是多條的,所以通話記錄是一個列表,刪除通話記錄就是將該列表變成空列表)
- 刪除聯系人
1 def del_contact(self, info): 2 # 刪除聯系人 3 try: 4 self.data.remove(info) 5 except Exception as e: 6 print(e) 7 self.update_contact() 8 print('成功刪除聯系人: {}'.format(info['name']))
刪除聯系人之后,該聯系人的個人信息頁也就沒意義,所以是刪除成功就直接回到主頁面
- 呼叫聯系人
1 def call(self, info): 2 # 呼叫聯系人 3 print('呼叫{}'.format(info['name']).center(20, '=')) 4 print('通話中...') 5 self.data.remove(info) 6 start_time = time.time() 7 now_time = time.ctime() 8 input('按e掛斷電話>>') 9 end_time = time.time() 10 pass_time = end_time - start_time 11 info['call_records'].append(now_time+"通話時長:"+str(pass_time)) # 將本次通話加入通話記錄的列表中 12 self.data.append(info) 13 self.update_contact() 14 print('通話結束')
這兒方法很簡單,就是記錄開始時間start_time之后,提示用戶隨時可以結束通話(按e(end)掛斷),然后通話結束之后,又會得到一個結束時間end_time,這樣通話時長就可以得到了,通話時間就是撥號時的時間。
- 呼叫記錄
1 def call_logs(self, info): 2 # 通話記錄 3 print('呼叫記錄'.center(20, '=')) 4 with open('contact.txt', 'r', encoding='utf-8') as f: 5 data_list = json.loads(f.read()) 6 for data in data_list: 7 if data['name'] == info['name']: 8 print(data['call_records']) 9 break 10 else: 11 continue
這個沒什么好說的,就是讀取通訊錄信息,然后打印與該用戶的的通話記錄就可以了。
注意,上面的這些代碼,牽扯到通訊錄信息的增、刪、改的,在操作完之后都要將信息重新寫入一次,即模擬刷新通訊錄,這個刷新通訊錄的方法是update_contact(),代碼如下
1 def update_contact(self): 2 # 刷新通訊錄 3 with open('contact.txt', 'w', encoding='utf-8') as f: 4 try: 5 json.dump(self.data, f, ensure_ascii=False) 6 except Exception as e: 7 print('操作失敗:%s' % e)
注,self.data 是通訊錄里所有聯系人的信息的一個列表,刷新通訊錄實際上就是當self.data被修改之后,就重新將它寫進通訊錄,這樣就實現了更新的功能。dump()里面的參數ensure_ascii=False的作用是讓輸入的中文寫入時就是顯示中文,而不是unicode編碼。
- 主頁面中的添加聯系人
1 def add_contact(self): 2 # 添加聯系人 3 # print(self.data) 4 print('添加聯系人'.center(20, '=')) 5 new_contact = dict() 6 new_contact['name'] = input('請輸入聯系人備注>>') 7 new_contact['phone_number'] = input('請輸入號碼>>') 8 new_contact['call_records'] = [] 9 self.data.append(new_contact) 10 self.update_contact() # 更新通訊錄 11 print('成功添加聯系人')
- 主頁面中的顯示全部聯系人(如果不想慢慢查找,可以用這個方法實現顯示所有聯系人)
1 def show(self): 2 # 顯示所有聯系人 3 print('所有聯系人'.center(20, '=')) 4 contacts = {} # 所有聯系人的名字 5 for i in range(len(self.data)): 6 contacts[str(i)] = self.data[i]['name'] 7 print('{} {}'.format(str(i), self.data[i]['name'])) 8 command = input('請選擇查看聯系人>>') 9 name = contacts[command] 10 for data in self.data: 11 if data['name'] == name: 12 self.person_info(data) 13 else: 14 continue
代碼中讀取文件的方式是用json模塊
完整代碼:
1 # --*-- coding:utf-8 --*-- 2 3 import json 4 import time 5 6 7 class Contact(object): 8 9 data = "hello" 10 11 def __init__(self): 12 with open("contact.txt", 'r', encoding='utf-8') as f: 13 self.data = json.loads(f.read()) # 所有聯系人列表 14 # print(self.data, type(self.data)) 15 16 def main_menu(self): 17 # 主菜單(主頁面) 18 while True: 19 print('通訊錄'.center(20, '=')) 20 menu = {'1': '快速查找', 21 '2': '添加聯系人', 22 '3': '顯示所有聯系人'} 23 for k, v in menu.items(): 24 print(k + ' ' + v) 25 command = input('請選擇你的操作>>') 26 if command == '1': 27 self.search() 28 elif command == '2': 29 self.add_contact() 30 elif command == '3': 31 self.show() 32 elif command == 'q': 33 print('退出...') 34 break 35 36 def search(self): 37 print('快速查找'.center(20, '=')) 38 # 可以根據聯系人名字查找,也可以根據電話號碼查找 39 find_info = input('請輸入查找信息>>') 40 count = 0 41 for i in range(len(self.data)): 42 if count > len(self.data): 43 print('未找到該聯系人') 44 break 45 if find_info in self.data[i]['name']: 46 self.person_info(self.data[i]) # 若有該聯系人,則進入聯系人個人信息頁 47 elif find_info in self.data[i]['phone_number']: 48 self.person_info(self.data[i]) # 若有該號碼,則進入聯系人個人信息頁 49 else: 50 pass 51 count += 1 52 53 def person_info(self, info): 54 # 個人信息頁 55 # find_info 是該聯系人的信息字典 56 print('已為你找到:{}'.format(info['name'])) 57 menu = {'1': '查看個人信息', '2': '修改信息', '3': '刪除聯系人', '4': '呼叫聯系人', '5': '呼叫記錄'} 58 while True: 59 print('個人信息頁'.center(20, '=')) 60 for k, v in menu.items(): 61 print(k + ' ' + v) 62 command = input('請選擇操作>>') 63 if command == '1': 64 print('姓名:{}\n電話號碼:{}\n通話記錄:{}'.format(info['name'], 65 info['phone_number'], info['call_records'])) 66 elif command == '2': 67 self.modify_info(info) 68 elif command == '3': 69 self.del_contact(info) 70 break # 刪除聯系人之后,該聯系人的個人信息頁就沒了,所以就得跳回去 71 elif command == '4': 72 self.call(info) 73 elif command == '5': 74 self.call_logs(info) 75 elif command == 'q': 76 print('返回...') 77 break 78 79 def call_logs(self, info): 80 # 通話記錄 81 print('呼叫記錄'.center(20, '=')) 82 with open('contact.txt', 'r', encoding='utf-8') as f: 83 data_list = json.loads(f.read()) 84 for data in data_list: 85 if data['name'] == info['name']: 86 print(data['call_records']) 87 break 88 else: 89 continue 90 91 def call(self, info): 92 # 呼叫聯系人 93 print('呼叫{}'.format(info['name']).center(20, '=')) 94 print('通話中...') 95 self.data.remove(info) 96 start_time = time.time() 97 now_time = time.ctime() 98 input('按e掛斷電話>>') 99 end_time = time.time() 100 pass_time = end_time - start_time 101 info['call_records'].append(now_time+"通話時長:"+str(pass_time)) # 將本次通話加入通話記錄的列表中 102 self.data.append(info) 103 self.update_contact() 104 print('通話結束') 105 106 def del_contact(self, info): 107 # 刪除聯系人 108 try: 109 self.data.remove(info) 110 except Exception as e: 111 print(e) 112 self.update_contact() 113 print('成功刪除聯系人: {}'.format(info['name'])) 114 115 def modify_info(self, info): 116 # 修改聯系人信息 117 # info是該聯系人信息字典 118 if info in self.data: 119 self.data.remove(info) # 將所有聯系人的列表中的該聯系人刪除,等修改好之后再后在重新加進去,然后更新通訊錄 120 menu = {'1': '修改備注', '2': '修改號碼', '3': '刪除通話記錄'} 121 while True: 122 print('修改信息'.center(20, '=')) 123 for k, v in menu.items(): 124 print(k + ' ' + v) 125 command = input('請選擇操作>>') 126 if command == 'q': 127 print('返回...') 128 break 129 if command == '1': 130 info['name'] = input('請輸入備注>>') 131 elif command == '2': 132 info['phone_number'] = input('請輸入號碼>>') 133 elif command == '3': 134 info['call_records'] = [] 135 else: 136 continue 137 self.data.append(info) # 將修改過的該聯系人信息加入所有聯系人信息列表,以待更新通訊錄 138 # print(self.data) 139 self.update_contact() # 更新通訊錄 140 print('信息修改成功') 141 142 def update_contact(self): 143 # 刷新通訊錄 144 with open('contact.txt', 'w', encoding='utf-8') as f: 145 try: 146 json.dump(self.data, f, ensure_ascii=False) 147 except Exception as e: 148 print('操作失敗:%s' % e) 149 150 def add_contact(self): 151 # 添加聯系人 152 # print(self.data) 153 print('添加聯系人'.center(20, '=')) 154 new_contact = dict() 155 new_contact['name'] = input('請輸入聯系人備注>>') 156 new_contact['phone_number'] = input('請輸入號碼>>') 157 new_contact['call_records'] = [] 158 self.data.append(new_contact) 159 self.update_contact() # 更新通訊錄 160 print('成功添加聯系人') 161 162 def show(self): 163 # 顯示所有聯系人 164 print('所有聯系人'.center(20, '=')) 165 contacts = {} # 所有聯系人的名字 166 for i in range(len(self.data)): 167 contacts[str(i)] = self.data[i]['name'] 168 print('{} {}'.format(str(i), self.data[i]['name'])) 169 command = input('請選擇查看聯系人>>') 170 name = contacts[command] 171 for data in self.data: 172 if data['name'] == name: 173 self.person_info(data) 174 else: 175 continue 176 177 178 if __name__ == '__main__': 179 a1 = Contact() 180 a1.main_menu()