当前位置:   article > 正文

Python实现通讯录管理系统升级版本_tkinter设计通讯录

tkinter设计通讯录

主要功能:
(1)能建立、修改和增删学生通讯录
(2)能够按多种方式进行查询
要求:界面友好,易于操作

添加了 菜单栏 等操作

 在原来的基础上进行了修改

就算进行无脑操作也不会报错,诺有报错请留言,我会第一时间进行更改操作

  1. from tkinter import *
  2. from tkinter import font
  3. from tkinter import messagebox
  4. from os import path
  5. from os import remove
  6. import platform
  7. import os
  8. '''
  9. '''
  10. # 添加、编辑联系人弹出框类
  11. class PopupWindow(object):
  12. # 初始化构造及添加组件到弹出框
  13. def __init__(self, master, main_window, title, contact=None):
  14. self.main_window = main_window
  15. top = self.top = Toplevel(master)
  16. top.title(title)
  17. top.resizable(False, False)
  18. w = 300
  19. h = 400
  20. top.geometry('%dx%d+%d+%d' % (w, h, (ws - w) / 2, (hs - h) / 2))
  21. top.bind('<Escape>', lambda event: top.destroy())
  22. m_font = font.Font(size=16)
  23. l = Label(top, text="姓名:", font=m_font)
  24. l.pack(side=TOP, pady=6)
  25. self.e1 = Entry(top)
  26. self.e1.pack(side=TOP, padx=16, ipady=3, fill=X)
  27. self.e1.focus()
  28. if contact is not None:
  29. self.e1.insert(0, contact.name)
  30. l2 = Label(top, text="电话号码:", font=m_font)
  31. l2.pack(side=TOP, pady=6)
  32. self.e2 = Entry(top)
  33. self.e2.pack(side=TOP, padx=16, ipady=3, fill=X)
  34. if contact is not None:
  35. self.e2.insert(0, contact.phone_number)
  36. l2 = Label(top, text="QQ号码:", font=m_font)
  37. l2.pack(side=TOP, pady=6)
  38. self.e5 = Entry(top)
  39. self.e5.pack(side=TOP, padx=16, ipady=3, fill=X)
  40. if contact is not None:
  41. self.e5.insert(0, contact.QQ_number)
  42. l2 = Label(top, text="宿舍:", font=m_font)
  43. l2.pack(side=TOP, pady=6)
  44. self.e3 = Entry(top)
  45. self.e3.pack(side=TOP, padx=16, ipady=3, fill=X)
  46. if contact is not None:
  47. self.e3.insert(0, contact.work_place)
  48. l2 = Label(top, text="邮箱:", font=m_font)
  49. l2.pack(side=TOP, pady=6)
  50. self.e4 = Entry(top)
  51. self.e4.pack(side=TOP, padx=16, ipady=3, fill=X)
  52. if contact is not None:
  53. self.e4.insert(0, contact.e_mail)
  54. if contact is None:
  55. b2 = Button(top, text='添加', width=12, command=lambda: self.add_click(None))
  56. self.e4.bind('<Return>', self.add_click)
  57. else:
  58. b2 = Button(top, text='编辑', width=12, command=lambda: self.edit_click(None))
  59. self.e4.bind('<Return>', self.edit_click)
  60. b2.pack(side=LEFT, pady=10, padx=20)
  61. b3 = Button(top, text='取消', width=12, command=lambda: top.destroy())
  62. b3.pack(side=RIGHT, pady=10, padx=20)
  63. top.grab_set()
  64. # 点击编辑联系人按钮
  65. def edit_click(self, event):
  66. e1_name = self.e1.get()
  67. if not e1_name:
  68. messagebox.showinfo("出错了", '名字不能为空!')
  69. return
  70. e2_name = self.e2.get()
  71. if not e2_name:
  72. messagebox.showinfo("出错了", '电话号码不能为空!')
  73. return
  74. e3_name = self.e3.get()
  75. e4_name = self.e4.get()
  76. e5_name = self.e5.get()
  77. self.main_window.edit_value(e1_name, e2_name, e3_name, e4_name,e5_name)
  78. self.top.destroy()
  79. # 点击添加联系人按钮
  80. def add_click(self, event):
  81. e1_name = self.e1.get()
  82. if not e1_name:
  83. messagebox.showinfo("出错了", '名字不能为空!')
  84. return
  85. e2_name = self.e2.get()
  86. if not e2_name:
  87. messagebox.showinfo("出错了", '电话号码不能为空!')
  88. return
  89. e3_name = self.e3.get()
  90. e4_name = self.e4.get()
  91. e5_name = self.e5.get()
  92. self.main_window.add_value(e1_name, e2_name, e3_name, e4_name,e5_name)
  93. self.top.destroy()
  94. # 主界面类
  95. class MainWindow(object):
  96. # 默认初始化构造
  97. def __init__(self, root):
  98. self.contacts = []
  99. self.root = root
  100. self.add_btn_widget()
  101. self.add_search_widget()
  102. self.add_listbox_widget()
  103. self.add_statusbar_widget()
  104. self.read_save_contacts()
  105. self.sel_item = 0
  106. m = Menu(root)
  107. filemenu = Menu(m)
  108. for item in['退出']:
  109. filemenu.add_command(label ='编辑联系人',command=self.edit_contact)
  110. filemenu.add_command(label = '删除联系人',command=self.del_contact)
  111. filemenu.add_command(label=item,command=self.exitz)
  112. m.add_cascade(label = '帮助',menu = filemenu)
  113. m.add_command(label = '当前版本号',command=self.viss)
  114. m.add_command(label = '团队介绍',command=self.zhizuoren)
  115. root['menu'] = m
  116. #退出操作
  117. def zhizuoren(self):
  118. messagebox.showinfo("制作人:第十小组\n成员: 负责代码\n成员: 负责报告撰写\n成员: 负责流程图\n成员: 主讲人")
  119. def exitz(self):
  120. exit()
  121. #获取Python系统版本号
  122. def viss(self):
  123. messagebox.showinfo(platform.python_version())
  124. # 添加操作按钮
  125. def add_btn_widget(self):
  126. frame = Frame(self.root)
  127. frame.pack(pady=8)
  128. self.addBtn = Button(frame, text='添加联系人', width=15, command=lambda: self.popup("添加联系人"))
  129. self.addBtn.pack(padx=6, fill=X, side=LEFT)
  130. self.delAllBtn = Button(frame, text='删除所有联系人', width=15, command=self.del_all_contacts)
  131. self.delAllBtn.pack(padx=6, fill=X, side=LEFT)
  132. self.saveAllBtn = Button(frame, text='保存所有联系人', width=15, command=self.save_all_contacts)
  133. self.saveAllBtn.pack(padx=6, fill=X, side=LEFT)
  134. # 添加搜索框
  135. def add_search_widget(self):
  136. frame = Frame(self.root)
  137. frame.pack(pady=8)
  138. entry1 = self.input_view = Entry(frame, width=34)
  139. entry1.insert(0, '输入部分姓名或电话号码按回车查询')
  140. entry1.bind("<Button-1>", self.click_input)
  141. entry1.bind("<FocusOut>", self.focusout_input)
  142. entry1.bind('<Return>', self.search_contact)
  143. entry1.bind('<Escape>', self.cancel_search)
  144. entry1.pack(ipady=3, padx=6, side=LEFT)
  145. entry1.selection_range(0, len(entry1.get()))
  146. entry1.focus()
  147. command4 = self.search_btn = Button(frame, text='清空输入', width=15, command=lambda: self.cancel_search(None))
  148. command4["state"] = "disabled"
  149. command4.pack(padx=6, side=LEFT)
  150. # 点击输入框清空内容
  151. def click_input(self, event):
  152. if self.input_view.get() == '输入部分姓名或电话号码按回车查询':
  153. self.input_view.delete(0, END)
  154. # 输入框失去焦点时
  155. def focusout_input(self, event):
  156. if len(self.input_view.get()) == 0:
  157. self.input_view.insert(0, '输入部分姓名或电话号码按回车查询')
  158. # 添加列表及滚动条
  159. def add_listbox_widget(self):
  160. frame = Frame(self.root)
  161. frame.pack(pady=8)
  162. bolded = font.Font(size=20)
  163. self.lb = Listbox(frame, font=bolded, height=14, width=25, borderwidth=0)
  164. scrollbar = Scrollbar(frame, orient=VERTICAL)
  165. scrollbar.config(command=self.lb.yview)
  166. scrollbar.pack(side=RIGHT, fill=Y)
  167. self.lb.config(yscrollcommand=scrollbar.set, activestyle='none')
  168. scrollbar2 = Scrollbar(frame, orient=HORIZONTAL)
  169. scrollbar2.config(command=self.lb.xview)
  170. scrollbar2.pack(side=BOTTOM, fill=X)
  171. self.lb.config(xscrollcommand=scrollbar2.set, activestyle='none')
  172. self.lb.pack(fill=BOTH)
  173. self.lb.bind('<Double-1>', self.dbclick)
  174. self.lb.bind('<Button-3>', self.rclick_popup)
  175. # 添加界面底部联系人数
  176. def add_statusbar_widget(self):
  177. frame = Frame(self.root)
  178. frame.pack(pady=8, side=LEFT)
  179. self.label = Label(frame, text='>系统现有 0 位联系人<')
  180. self.label.pack()
  181. # 右键菜单
  182. def rclick_popup(self, event):
  183. a_menu = Menu(self.root, tearoff=0)
  184. a_menu.add_command(label='编辑选中的联系人', command=self.edit_contact)
  185. a_menu.add_command(label='删除选中的联系人', command=self.del_contact)
  186. a_menu.post(event.x_root, event.y_root)
  187. # 右键编辑选中的联系人
  188. def edit_contact(self):
  189. selection = self.lb.curselection()
  190. if len(selection) == 0:
  191. messagebox.showerror("出错了", '请先左键选中待操作的联系人!')
  192. return
  193. self.sel_item = selection[0]
  194. self.right_clidk_reset()
  195. contact = self.contacts[self.sel_item]
  196. self.popup("编辑联系人", contact=contact)
  197. # 右键删除选中的联系人
  198. def del_contact(self):
  199. selection = self.lb.curselection()
  200. if len(selection) == 0:
  201. messagebox.showerror("出错了", '请先左键选中待操作的联系人!')
  202. return
  203. self.right_clidk_reset()
  204. answer = messagebox.askyesno("提示", "您确定要删除此联系人吗?")
  205. if answer:
  206. self.lb.delete(self.sel_item, self.sel_item)
  207. self.contacts.pop(self.sel_item)
  208. self.label.config(text='系统现有 %d 位联系人' % len(self.contacts))
  209. messagebox.showinfo('提示', '联系人从列表删除成功!\n若需要保存操作结果,请点击“保存所有联系人”')
  210. # 若是搜索后右键,则操作重置列表
  211. def right_clidk_reset(self, is_dbclick=False):
  212. b_text = self.search_btn["state"]
  213. if b_text == "normal":
  214. ic = -1
  215. item = self.lb.selection_get()
  216. if not is_dbclick:
  217. self.cancel_search(None)
  218. for ct in self.contacts:
  219. ic += 1
  220. if (ct.name in item) and (ct.phone_number in item):
  221. break
  222. self.sel_item = ic
  223. self.lb.selection_set(ic, ic)
  224. # 双击联系人条目
  225. def dbclick(self, event):
  226. selection = self.lb.curselection()
  227. self.sel_item = selection[0]
  228. self.right_clidk_reset(is_dbclick=True)
  229. contact = self.contacts[self.sel_item]
  230. wp = contact.work_place if len(contact.work_place) != 0 else '空'
  231. em = contact.e_mail if len(contact.e_mail) != 0 else '空'
  232. msg = '姓名:%s\n电话:%s\n宿舍:%s\n邮箱地址:%s' % (contact.name, contact.phone_number, wp, em)
  233. messagebox.showinfo("详细信息", msg)
  234. # 添加、编辑联系人弹窗
  235. def popup(self, title, contact=None):
  236. self.cancel_search(None)
  237. self.w = PopupWindow(self.root, self, title, contact)
  238. self.addBtn["state"] = "disabled"
  239. self.root.wait_window(self.w.top)
  240. self.addBtn["state"] = "normal"
  241. # 删除所有联系人
  242. def del_all_contacts(self):
  243. self.cancel_search(None)
  244. answer = messagebox.askyesno("提示", "您确定要删除所有联系人吗?")
  245. try:
  246. if answer:
  247. self.contacts.clear()
  248. self.lb.delete(0, END)
  249. remove("contacts.csv")
  250. self.label.config(text='系统现有 %d 位联系人' % len(self.contacts))
  251. except:
  252. f = open("contacts.csv", "w", encoding='utf-8')
  253. # 保存联系人到文件
  254. def save_all_contacts(self):
  255. self.cancel_search(None)
  256. try:
  257. f = open("contacts.csv", "w", encoding='utf-8')
  258. for contact in self.contacts:
  259. str = '%s,%s,%s,%s\n' % (contact.name, contact.phone_number, contact.work_place, contact.e_mail)
  260. f.write(str)
  261. f.close()
  262. except IOError:
  263. f = open("contacts.csv", "r", encoding='utf-8')
  264. for contact in self.contacts:
  265. str = '%s,%s,%s,%s\n' % (contact.name, contact.phone_number, contact.work_place, contact.e_mail)
  266. f.write(str)
  267. f.close()
  268. messagebox.showinfo('提示', '保存 %d 位联系人到文件成功!' % len(self.contacts))
  269. # 读取保存在文件的联系人
  270. def read_save_contacts(self):
  271. if not path.exists('contacts.csv'):
  272. return
  273. f = open("contacts.csv", "r", encoding='utf-8')
  274. for line in f:
  275. array = line.strip().split(',')
  276. contact = Contact(array[0], array[1], array[2], array[3])
  277. self.contacts.append(contact)
  278. self.lb.insert(END, '%s 电话:%s QQ:%s' % (contact.name, contact.phone_number,contact.QQ_number))
  279. self.label.config(text='系统现有 %d 位联系人' % len(self.contacts))
  280. f.close()
  281. # 添加联系人回调
  282. def add_value(self, name, phone_number, work_place, e_mail,QQ_number):
  283. contact = Contact(name, phone_number, work_place, e_mail,QQ_number)
  284. self.contacts.append(contact)
  285. self.lb.insert(END, '%s 电话:%s QQ:%s' % (name, phone_number,QQ_number))
  286. self.label.config(text='系统现有 %d 位联系人' % len(self.contacts))
  287. # 编辑联系回调
  288. def edit_value(self, name, phone_number, work_place, e_mail,QQ_number):
  289. contact = self.contacts[self.sel_item]
  290. contact.name = name
  291. contact.phone_number = phone_number
  292. contact.work_place = work_place
  293. contact.e_mail = e_mail
  294. self.lb.delete(0, END)
  295. for contact in self.contacts:
  296. self.lb.insert(END, '%s 电话:%s QQ:%s' % (contact.name, contact.phone_number,contact.QQ_number))
  297. self.label.config(text='系统现有 %d 位联系人' % len(self.contacts))
  298. # 搜索联系人方法
  299. def search_contact(self, event):
  300. self.search_btn["state"] = "normal"
  301. self.lb.delete(0, END)
  302. key = self.input_view.get().strip()
  303. ci = 0
  304. for contact in self.contacts:
  305. if (key in contact.name) or (key in contact.phone_number) or (key in contact.QQ_number):
  306. self.lb.insert(END, '%s 电话:%s QQ:%s' % (contact.name, contact.phone_number,contact.QQ_number))
  307. ci += 1
  308. self.label.config(text='查询到 %d 位联系人' % ci)
  309. # 取消搜索
  310. def cancel_search(self, event):
  311. b_state = self.search_btn["state"]
  312. if b_state == "normal":
  313. self.search_btn["state"] = "disabled"
  314. self.lb.delete(0, END)
  315. self.input_view.delete(0, END)
  316. self.input_view.insert(0, '输入部分姓名或电话,QQ按回车查询')
  317. for contact in self.contacts:
  318. self.lb.insert(END, '%s 电话:%s QQ:%s' % (contact.name, contact.phone_number,contact.QQ_number))
  319. self.label.config(text='系统现有 %d 位联系人' % len(self.contacts))
  320. self.input_view.selection_range(0, len(self.input_view.get()))
  321. #关于系统版本
  322. # 联系人类对象
  323. class Contact:
  324. def __init__(self, name, phone_number, work_place, e_mail,QQ_number):
  325. self.name = name
  326. self.phone_number = phone_number
  327. self.work_place = work_place
  328. self.e_mail = e_mail
  329. self.QQ_number = QQ_number
  330. # 程序启动入口
  331. if __name__ == "__main__":
  332. root = Tk()
  333. root.wm_resizable(False, False)
  334. root.title('学生通讯录管理系统v3.1.8版本')
  335. w = 400
  336. h = 560
  337. ws = root.winfo_screenwidth()
  338. hs = root.winfo_screenheight()
  339. root.geometry('%dx%d+%d+%d' % (w, h, (ws - w) / 2, (hs - h) / 2))
  340. m = MainWindow(root)
  341. root.mainloop()

能够获取当前Python的版本号 以及自定义的团队介绍 还需要添加其他功能请留言。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/464753
推荐阅读
相关标签
  

闽ICP备14008679号