python寫一個通訊錄


  閑着沒事,用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()

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM