功能需求

设计“通讯录管理系统”使其具有数据插入、修改、删除、显示和查询等功能。需求如下:

(1)数据包括人名、工作单位、电话号码和E-mail地址

(2)可对记录中的姓名和电话号码进行修改

(3)可增加或删除记录

(4)可显示所有保存的记录

(5)可按人名或电话号码进行查询

# -*- coding: utf-8 -*-
# 作者:kaifang 2018/11/21from tkinter import *
from tkinter import font
from tkinter import messagebox
from os import path
from os import remove'''
联系人管理系统V1.0开发语言:Python3开发工具:pycharm 社区版
'''# 添加、编辑联系人弹出框类
class PopupWindow(object):# 初始化构造及添加组件到弹出框def __init__(self, master, main_window, title, contact=None):self.main_window = main_windowtop = self.top = Toplevel(master)top.title(title)top.resizable(False, False)w = 280h = 320top.geometry('%dx%d+%d+%d' % (w, h, (ws - w) / 2, (hs - h) / 2))top.bind('<Escape>', lambda event: top.destroy())m_font = font.Font(size=16)l = Label(top, text="姓名:", font=m_font)l.pack(side=TOP, pady=5)self.e1 = Entry(top)self.e1.pack(side=TOP, padx=16, ipady=3, fill=X)self.e1.focus()if contact is not None:self.e1.insert(0, contact.name)l2 = Label(top, text="电话号码:", font=m_font)l2.pack(side=TOP, pady=5)self.e2 = Entry(top)self.e2.pack(side=TOP, padx=16, ipady=3, fill=X)if contact is not None:self.e2.insert(0, contact.phone_number)l2 = Label(top, text="工作单位:", font=m_font)l2.pack(side=TOP, pady=5)self.e3 = Entry(top)self.e3.pack(side=TOP, padx=16, ipady=3, fill=X)if contact is not None:self.e3.insert(0, contact.work_place)l2 = Label(top, text="E-mail地址:", font=m_font)l2.pack(side=TOP, pady=5)self.e4 = Entry(top)self.e4.pack(side=TOP, padx=16, ipady=3, fill=X)if contact is not None:self.e4.insert(0, contact.e_mail)if contact is None:b2 = Button(top, text='添加', width=12, command=lambda: self.add_click(None))self.e4.bind('<Return>', self.add_click)else:b2 = Button(top, text='编辑', width=12, command=lambda: self.edit_click(None))self.e4.bind('<Return>', self.edit_click)b2.pack(side=LEFT, pady=10, padx=20)b3 = Button(top, text='取消', width=12, command=lambda: top.destroy())b3.pack(side=RIGHT, pady=10, padx=20)top.grab_set()# 点击编辑联系人按钮def edit_click(self, event):e1_name = self.e1.get()if not e1_name:messagebox.showinfo("出错了", '名字不能为空!')returne2_name = self.e2.get()if not e2_name:messagebox.showinfo("出错了", '电话号码不能为空!')returne3_name = self.e3.get()e4_name = self.e4.get()self.main_window.edit_value(e1_name, e2_name, e3_name, e4_name)self.top.destroy()# 点击添加联系人按钮def add_click(self, event):e1_name = self.e1.get()if not e1_name:messagebox.showinfo("出错了", '名字不能为空!')returne2_name = self.e2.get()if not e2_name:messagebox.showinfo("出错了", '电话号码不能为空!')returne3_name = self.e3.get()e4_name = self.e4.get()self.main_window.add_value(e1_name, e2_name, e3_name, e4_name)self.top.destroy()# 主界面类
class MainWindow(object):# 默认初始化构造def __init__(self, root):self.contacts = []self.root = rootself.add_btn_widget()self.add_search_widget()self.add_listbox_widget()self.add_statusbar_widget()self.read_save_contacts()self.sel_item = 0# 添加操作按钮def add_btn_widget(self):frame = Frame(self.root)frame.pack(pady=8)self.addBtn = Button(frame, text='添加联系人', width=15, command=lambda: self.popup("添加联系人"))self.addBtn.pack(padx=5, fill=X, side=LEFT)self.delAllBtn = Button(frame, text='删除所有联系人', width=15, command=self.del_all_contacts)self.delAllBtn.pack(padx=5, fill=X, side=LEFT)self.saveAllBtn = Button(frame, text='保存所有联系人', width=15, command=self.save_all_contacts)self.saveAllBtn.pack(padx=5, fill=X, side=LEFT)# 添加搜索框def add_search_widget(self):frame = Frame(self.root)frame.pack(pady=8)entry1 = self.input_view = Entry(frame, width=34)entry1.insert(0, '输入部分姓名或电话号码按回车查询')entry1.bind("<Button-1>", self.click_input)entry1.bind("<FocusOut>", self.focusout_input)entry1.bind('<Return>', self.search_contact)entry1.bind('<Escape>', self.cancel_search)entry1.pack(ipady=3, padx=5, side=LEFT)entry1.selection_range(0, len(entry1.get()))entry1.focus()command4 = self.search_btn = Button(frame, text='清空输入', width=15, command=lambda: self.cancel_search(None))command4["state"] = "disabled"command4.pack(padx=5, side=LEFT)# 点击输入框清空内容def click_input(self, event):if self.input_view.get() == '输入部分姓名或电话号码按回车查询':self.input_view.delete(0, END)# 输入框失去焦点时def focusout_input(self, event):if len(self.input_view.get()) == 0:self.input_view.insert(0, '输入部分姓名或电话号码按回车查询')# 添加列表及滚动条def add_listbox_widget(self):frame = Frame(self.root)frame.pack(pady=8)bolded = font.Font(size=20)self.lb = Listbox(frame, font=bolded, height=14, width=25, borderwidth=0)scrollbar = Scrollbar(frame, orient=VERTICAL)scrollbar.config(command=self.lb.yview)scrollbar.pack(side=RIGHT, fill=Y)self.lb.config(yscrollcommand=scrollbar.set, activestyle='none')scrollbar2 = Scrollbar(frame, orient=HORIZONTAL)scrollbar2.config(command=self.lb.xview)scrollbar2.pack(side=BOTTOM, fill=X)self.lb.config(xscrollcommand=scrollbar2.set, activestyle='none')self.lb.pack(fill=BOTH)self.lb.bind('<Double-1>', self.dbclick)self.lb.bind('<Button-3>', self.rclick_popup)# 添加界面底部联系人数def add_statusbar_widget(self):frame = Frame(self.root)frame.pack(pady=8, side=LEFT)self.label = Label(frame, text='>系统现有 0 位联系人<')self.label.pack()# 右键菜单def rclick_popup(self, event):a_menu = Menu(self.root, tearoff=0)a_menu.add_command(label='编辑选中的联系人', command=self.edit_contact)a_menu.add_command(label='删除选中的联系人', command=self.del_contact)a_menu.post(event.x_root, event.y_root)# 右键编辑选中的联系人def edit_contact(self):selection = self.lb.curselection()if len(selection) == 0:messagebox.showerror("出错了", '请先左键选中待操作的联系人!')returnself.sel_item = selection[0]self.right_clidk_reset()contact = self.contacts[self.sel_item]self.popup("编辑联系人", contact=contact)# 右键删除选中的联系人def del_contact(self):selection = self.lb.curselection()if len(selection) == 0:messagebox.showerror("出错了", '请先左键选中待操作的联系人!')returnself.right_clidk_reset()answer = messagebox.askyesno("提示", "您确定要删除此联系人吗?")if answer:self.lb.delete(self.sel_item, self.sel_item)self.contacts.pop(self.sel_item)self.label.config(text='系统现有 %d 位联系人' % len(self.contacts))messagebox.showinfo('提示', '联系人从列表删除成功!\n若需要保存操作结果,请点击“保存所有联系人”')# 若是搜索后右键,则操作重置列表def right_clidk_reset(self, is_dbclick=False):b_text = self.search_btn["state"]if b_text == "normal":ic = -1item = self.lb.selection_get()if not is_dbclick:self.cancel_search(None)for ct in self.contacts:ic += 1if (ct.name in item) and (ct.phone_number in item):breakself.sel_item = icself.lb.selection_set(ic, ic)# 双击联系人条目def dbclick(self, event):selection = self.lb.curselection()self.sel_item = selection[0]self.right_clidk_reset(is_dbclick=True)contact = self.contacts[self.sel_item]wp = contact.work_place if len(contact.work_place) != 0 else '空'em = contact.e_mail if len(contact.e_mail) != 0 else '空'msg = '姓名:%s\n电话:%s\n工作单位:%s\nE-mail地址:%s' % (contact.name, contact.phone_number, wp, em)messagebox.showinfo("详细信息", msg)# 添加、编辑联系人弹窗def popup(self, title, contact=None):self.cancel_search(None)self.w = PopupWindow(self.root, self, title, contact)self.addBtn["state"] = "disabled"self.root.wait_window(self.w.top)self.addBtn["state"] = "normal"# 删除所有联系人def del_all_contacts(self):self.cancel_search(None)answer = messagebox.askyesno("提示", "您确定要删除所有联系人吗?")if answer:self.contacts.clear()self.lb.delete(0, END)remove("contacts.csv")self.label.config(text='系统现有 %d 位联系人' % len(self.contacts))# 保存联系人到文件def save_all_contacts(self):self.cancel_search(None)f = open("contacts.csv", "w", encoding='utf-8')for contact in self.contacts:str = '%s,%s,%s,%s\n' % (contact.name, contact.phone_number, contact.work_place, contact.e_mail)f.write(str)f.close()messagebox.showinfo('提示', '保存 %d 位联系人到文件成功!' % len(self.contacts))# 读取保存在文件的联系人def read_save_contacts(self):if not path.exists('contacts.csv'):returnf = open("contacts.csv", "r", encoding='utf-8')for line in f:array = line.strip().split(',')contact = Contact(array[0], array[1], array[2], array[3])self.contacts.append(contact)self.lb.insert(END, '%s Tel:%s' % (contact.name, contact.phone_number))self.label.config(text='系统现有 %d 位联系人' % len(self.contacts))f.close()# 添加联系人回调def add_value(self, name, phone_number, work_place, e_mail):contact = Contact(name, phone_number, work_place, e_mail)self.contacts.append(contact)self.lb.insert(END, '%s Tel:%s' % (name, phone_number))self.label.config(text='系统现有 %d 位联系人' % len(self.contacts))# 编辑联系回调def edit_value(self, name, phone_number, work_place, e_mail):contact = self.contacts[self.sel_item]contact.name = namecontact.phone_number = phone_numbercontact.work_place = work_placecontact.e_mail = e_mailself.lb.delete(0, END)for contact in self.contacts:self.lb.insert(END, '%s Tel:%s' % (contact.name, contact.phone_number))self.label.config(text='系统现有 %d 位联系人' % len(self.contacts))# 搜索联系人方法def search_contact(self, event):self.search_btn["state"] = "normal"self.lb.delete(0, END)key = self.input_view.get().strip()ci = 0for contact in self.contacts:if (key in contact.name) or (key in contact.phone_number):self.lb.insert(END, '%s Tel:%s' % (contact.name, contact.phone_number))ci += 1self.label.config(text='查询到 %d 位联系人' % ci)# 取消搜索def cancel_search(self, event):b_state = self.search_btn["state"]if b_state == "normal":self.search_btn["state"] = "disabled"self.lb.delete(0, END)self.input_view.delete(0, END)self.input_view.insert(0, '输入部分姓名或电话号码按回车查询')for contact in self.contacts:self.lb.insert(END, '%s Tel:%s' % (contact.name, contact.phone_number))self.label.config(text='系统现有 %d 位联系人' % len(self.contacts))self.input_view.selection_range(0, len(self.input_view.get()))# 联系人类对象
class Contact:def __init__(self, name, phone_number, work_place, e_mail):self.name = nameself.phone_number = phone_numberself.work_place = work_placeself.e_mail = e_mail# 程序启动入口
if __name__ == "__main__":root = Tk()root.wm_resizable(False, False)root.title('通讯录管理系统')w = 380h = 560ws = root.winfo_screenwidth()hs = root.winfo_screenheight()root.geometry('%dx%d+%d+%d' % (w, h, (ws - w) / 2, (hs - h) / 2))m = MainWindow(root)root.mainloop()

联系人管理系统 python版相关推荐

  1. 学生信息管理系统——python版(附流程图)

    声明 本篇代码对新手十分友好.我大一的期末考试作业,今天分享出来.当时写的时候也是一个新手,现在也不想再去修改了(一是太懒,二还是懒),所以有很多地方可能不足,但是运行完全没问题.我用的是列表加循环这 ...

  2. Python版名片管理系统源代码

    Python版名片管理系统,功能: 新增名片(记录用户的姓名,电话,QQ,邮箱): 显示所有名片: 查询名片: 查询成功后可以修改,删除名片 运行截图: cards_main.py :程序的入口,完整 ...

  3. Python版简易银行管理系统源代码,银行管理系统python代码、银行自助提款系统

    Python版简易银行管理系统源代码,银行管理系统python代码,实现开户.账户查询.存取款.转账.改密.锁定.解锁.补卡.销户等银行管理操作.账户信息存在allusers.txt中,通过该文件的读 ...

  4. Python项目实战:Python版超市管理系统源代码

    Python版超市管理系统可实现下单商品,修改商品数量,删除商品,结算商品. 程序使用元组代表商品,元组的多个元素分别代表商品条码,商品名称,商品单价: 使用dict来表示系统当前仓库中的所有商品,d ...

  5. Python学员管理系统进阶版

    Python学员管理系统进阶版 整合基础,使用面向对象的方式做学员管理系统 文章目录 Python学员管理系统进阶版 前言 一.系统需求 1.创建程序文件 2.书写程序 3.管理系统框架 二.功能函数 ...

  6. python机电管理系统gui版_Python学习之GUI--登录系统篇

    我的python环境是:python3.6.5 这里我选择的GUI编程包是:tkinter tkinker在python2.5以后就是自带包了,所以我们不需要另外安装 tkinker相对与其他pyth ...

  7. Python版超市管理系统源代码,基于django+mysql

    Python版超市管理系统源代码,基于django+mysql 安装步骤 1.在mysql中创建名为demo_django_supermarket的数据库,修改config/setting.py中数据 ...

  8. Python开发_小说管理系统CLL版

    小说管理系统CLI版 项目背景 ​ 随着网络文学的发展,读书不仅仅是在纸质文学上,大量的网络文学充斥着人们的视野.网络上越来越多的平台出现,有的小说只能在特定的平台展现.为了更好的记录小说,提升对小说 ...

  9. 电脑版企业微信_靠谱的企业客户管理系统电脑版下载

    (悟空CRM)在当今信息化技术不断发展的前提下,企业上云也逐步被广大企业了解并接受.是否部署CRM客户关系管理系统也成为企业信息化中无法绕开的问题,CRM对企业来说有哪些重要性和意义呢?1.优化对客户 ...

  10. AI智能联系人管理系统(一)

    前段时间练习过的一个小项目,今天再看看,记录一下~ 开发工具准备: 开发工具:PyCharm Python内置模块:sys.os.base64.json.collections 第三方模块:PyQt5 ...

最新文章

  1. div css 常用技巧
  2. 每日一皮:传说中的 10 大口头禅,你说过几个?
  3. 【人物】徐小平:远离创业的3个死亡陷阱
  4. CONTINUE...? ZOJ - 4033
  5. 在VS 2010上搭建Windows Phone 7开发平台
  6. BZOJ 1031: [JSOI2007]字符加密Cipher( 后缀数组 )
  7. 信息学奥赛一本通 1102:与指定数字相同的数的个数 | OpenJudge NOI 1.6 01
  8. 【NetWebApi】接口参数传递笔记
  9. strip python里面是什么意思_python中的strip是什么意思
  10. 云管理不是巴别塔 从数据跨入云之路
  11. 解决mysql Table ‘xxx’ is marked as crashed and should be repaired的问题。
  12. 普通用户使用docker命令
  13. 2022-2028全球骨科创伤植入物行业调研及趋势分析报告
  14. thing.js入门学习
  15. javascript实现下拉框表单美化的详细实例教程
  16. 把握消费节点,精细服务助推喆啡酒店创优
  17. 【19调剂】中国科学院上海天文台接收报考硕士研究生调剂生的通知
  18. 7-10 公路村村通 (30 分)(C语言)
  19. 【JavaSe】String类、StringBuilder、StringBuffer(超详细)
  20. linux 时间 find,linux find 时间time

热门文章

  1. 安卓 运行 linux 桌面,桌面系统来到手机 Ubuntu手机系统解析
  2. 基于单片机汽车防盗报警系统设计-单片机毕业课程设计
  3. Java成员变量初始化顺序
  4. 加权平均数的例子_加权平均数公式(加权平均数公式例子)
  5. java前端框架b_B-JUI
  6. 五一,我们来欣赏一篇宋词
  7. 将编译器的代码快速转存为图片
  8. TransModeler交通仿真软件的最新特点
  9. python大众点评霸王餐_如何抽中大众点评霸王餐?
  10. Alluxio的Raft HA实现