功能需求

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

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

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

(3)可增加或删除记录

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

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

# -*- coding: utf-8 -*-
from 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()

将本文件保存为: information.py

为了方便直接运行即可:

参考链接:https://blog.csdn.net/love_bb/article/details/84316411

联系人管理系统 Python GUI版相关推荐

  1. python游戏开发步骤_详解Python GUI版24点游戏制作过程

    本文作者为浙江温州永嘉县教师发展中心应根球老师,电子邮箱:ycicada@163.com. 传统用扑克牌算24点游戏用于小学低中段学生训练四则运算效果不错,也可用于防止老年痴呆.本项目模拟传统扑克24 ...

  2. 详解Python GUI版24点游戏制作过程

    本文作者为浙江温州永嘉县教师发展中心应根球老师,电子邮箱:ycicada@163.com. 传统用扑克牌算24点游戏用于小学低中段学生训练四则运算效果不错,也可用于防止老年痴呆.本项目模拟传统扑克24 ...

  3. PAGE:像Visual Studio一样设计Python GUI窗体

    虽然使用标准库tkinter开发Python GUI程序很方便,也提供了强大的功能,但是窗体上的一切都需要程序员使用代码来控制,在页面布局上浪费大量时间,确实不是很方便.今天我们来介绍一个叫做PAGE ...

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

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

  5. python车辆管理系统_Python简易版停车管理系统

    本文实例为大家分享了Python简易版停车管理系统的具体代码,供大家参考,具体内容如下 import time # 最大停车数 max_car = 100 # 当前停车数,初始为0 cur_car = ...

  6. 用python3做学生管理系统_详解用python实现基本的学生管理系统(文件存储版)(python3)...

    详解用python实现基本的学生管理系统(文件存储版)(python3) 来源:中文源码网    浏览: 次    日期:2019年11月5日 详解用python实现基本的学生管理系统(文件存储版)( ...

  7. python登录系统文件版_详解用python实现基本的学生管理系统(文件存储版)(python3)...

    这个是升级的版本,比较进阶一点的,相对与之前的文件管理系统,数据只是存储到了内存中,而不是存储到硬盘上,我们想让文件存储到硬盘上的话,一个是存储到文件里,一个是存储到数据库中,存储到数据库中的版本会后 ...

  8. Python简陋版工资管理系统

    题目: Python简陋版工资管理系统 要求: 彦 100000 盖伦 80000 莫甘娜 50000 赵信 30000 -----以上是info.txt文件----- 实现效果: 从info.txt ...

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

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

  10. 【Python成长之路】制作口令保险箱GUI版

    [写在前面] 平时工作中,经常会遇到同事们会咨询些相同的问题,或者经常会忘记某些不常用的口令密码什么的.因此需要经常去找记事本里的记录,然后再复制粘贴发给别人,觉得有点麻烦.刚好有次看一个帖子,也是口 ...

最新文章

  1. 用python画动图_用Python绘制会动的柱形竞赛图
  2. 在不锁定表的情况下运行MySQLDump
  3. linux设置网卡速率
  4. 编译linux内核成vmlinuz,编译一个内核 - no bzImage/vmlinuz生成
  5. python读取ttf_python解析字体反爬
  6. VC中数字与字符串转换方法
  7. 《敏捷可执行需求说明 Scrum提炼及实现技术》—— 3.4 关注干系人的“愿求”...
  8. 嵌入式linux驱动笔试,嵌入式Linux驱动工程师/BSP开发工程师面试笔试题集锦
  9. 共享单车需求预测问题:建模篇
  10. MSP430 F5529 单片机 OLED 音乐播放器 八音盒 蜂鸣器 音乐
  11. 主动轮廓线模型Snake模型简介openCV中cvSnakeImage()函数代码分析
  12. 完成静态服务器——Node.js摸石头系列之四
  13. 外包项目开发课程整理一:SDLC传统系统开发生命周期7个阶段
  14. Fzu 2198 快来快来数一数【矩阵快速幂】
  15. java_Stream流和Optional
  16. 笔记 | Java 虚拟机
  17. 关于GPS坐标转百度坐标与goolg坐标转百度坐标java代码实现方法
  18. 视觉设计师跟平面设计_用户体验设计师应了解的6条视觉设计原则
  19. JAVA代码总结开始篇【白丁水笔知其然】
  20. centos 安装 kong

热门文章

  1. Qt涂鸦板及其放大简例
  2. 学生如何提高专业英文阅读能力(转自施一公博客)
  3. 1.5W字Docker详解,从入门到下地干活一条龙
  4. jsp定义java方法_jsp中java成员变量、方法的声明以及使用
  5. 单元测试--Mockito之spy
  6. c语言编写好的程序运行自动退出,VS 2015 写的第一个c语言控制台程序,运行完程序就自动...
  7. 我的MacOS上的软件
  8. 16. Zigbee应用程序框架开发指南 - 扩展ZigBee Cluster Library (ZCL)
  9. linux 程序设置快捷方式,Linux中设置程序的桌面快捷方式
  10. BZOJ_P3110 [ZJOI2013]K大数查询(线段树+整体二分)