在使用text文本的通讯录的基础之上进行了改进
使用GUI图形界面
之后打算再研究一下用数据库记录数据
上篇的通讯录PythonPython 实例:手机通讯录(使用text文本记录数据)
下面是运行截图:
还有很多细节就不一,一演示了
单纯应付一下期末的作业
代码直接复制粘贴运行就可以使用了
import os
import tkinter
import json
import tkinter.messagebox
class MainForm:
def __init__(self):
root = tkinter.Tk()# 根窗体
# 标题名称
root.title('通讯录')
# 设置窗体初始大小
root.geometry("650x550")
# 设置窗体不可拉升
root.resizable(width=False, height=False)
# 添加新联系人
def handler_1(event):
def newinfo(event):
name = name_str.get()
phone = phone_num.get()
mail = mail_adr.get()
address = adr_str.get()
if name==""or phone==" " or mail==" " or address==" ":
tkinter.messagebox.showerror('错误', '所填信息都不能为空')
else:
card_dict = {"姓名": name, "手机号": phone,
"邮箱": mail, "地址": address}
f = open("通讯录.txt", mode='a+', encoding='utf-8')
# 将字典转换为str,然后再使用write()写入到通讯录的文本文件中
f.write(str(card_dict) + '\n')
f.close()
tkinter.messagebox.showinfo('消息提示框',f'添加“{name}“为联系人成功!')
# 注册成功关闭注册框
window_add.destroy()
# 新建注册界面
window_add = tkinter.Toplevel(root)
window_add.geometry('300x300')
window_add.title('注册')
#姓名
name_str = tkinter.StringVar()
tkinter.Label(window_add, text='请输入姓 名:').place(x=10, y=10)
tkinter.Entry(window_add, textvariable=name_str).place(x=110, y=10)
#手机号
phone_num = tkinter.StringVar()
tkinter.Label(window_add, text='请输入手机号:').place(x=10, y=50)
tkinter.Entry(window_add, textvariable=phone_num).place(x=110, y=50)
#邮箱
mail_adr = tkinter.StringVar()
tkinter.Label(window_add, text='请输入邮 箱:').place(x=10, y=90)
tkinter.Entry(window_add, textvariable=mail_adr).place(x=110, y=90)
#地址
adr_str= tkinter.StringVar()
tkinter.Label(window_add, text='请输入地 址:').place(x=10, y=130)
tkinter.Entry(window_add, textvariable=adr_str).place(x=110, y=130)
# 确认注册按钮及位置
confirm_button = tkinter.Button(window_add, text='确认添加',font=('黑体',15,'bold'))
confirm_button.bind("" ,newinfo)
confirm_button.place(x=100, y=180)
# 查看联系人
def handler_2(event):
# 窗体设置
window_all = tkinter.Toplevel(root)
window_all.geometry('600x400')
window_all.title('通讯录名单')
# 标题
name_label=tkinter.Label(window_all,text="名字", font=('黑体', 15, 'bold'))
name_label.grid(row=0,column=0)
phone_label = tkinter.Label(window_all, text="手机号", font=('黑体', 15, 'bold'))
phone_label.grid(row=0, column=1)
mail_label = tkinter.Label(window_all, text="邮箱", font=('黑体', 15, 'bold'))
mail_label.grid(row=0, column=2)
address_label = tkinter.Label(window_all, text="地址", font=('黑体', 15, 'bold'))
address_label.grid(row=0, column=3)
file = open("通讯录.txt", mode='r', encoding='utf-8')
# 如果通讯录.txt文件不为空,执行下面代码
if len(file.read()) != 0:
file.seek(0, 0)
file_data = file.read()
split_info = file_data.split('\n')
split_info.remove(split_info[len(split_info) - 1])
name_li = [] # 用于存储联系人姓名的列表
all_info_li = [] # 用于存储所有信息的列表
for i in split_info:
dict_info = json.loads(i.replace("\'", '\"'))
all_info_li.append(dict_info)
# 设置每个联系人信息的写入行
row_count = 0
for person_info in all_info_li:
row_count += 1
column_count = 0
for title, info_value in person_info.items():
tktest = tkinter.Label(window_all, text=info_value, font=('黑体', 13, 'bold'))
tktest . grid(row=row_count,column=column_count)
column_count += 1
else:
tkinter.messagebox.showinfo('消息提示框', '通讯录为空')
# 删除联系人
def handler_3(event):
def delinfo(event):
name = name_str.get()
file = open("通讯录.txt", mode='r+', encoding='utf-8')
# 如果通讯录.txt文件不为空时,执行下面代码
if len(file.read()) != 0:
file.seek(0, 0)
file_data = file.read()
split_info = file_data.split('\n')
split_info.remove(split_info[len(split_info) - 1])
name_li = [] # 用于存储联系人姓名的列表
all_info_li = [] # 用于存储所有信息的列表
for i in split_info:
dict_info = json.loads(i.replace("\'", '\"'))
all_info_li.append(dict_info)
name_li.append(dict_info['姓名'])
if name in name_li:
通讯录_copy = open('通讯录_copy.txt', mode='w', encoding="utf-8")
for person_info in all_info_li:
if name not in str(person_info):
通讯录_copy.write(str(person_info) + '\n')
通讯录_copy.close()
file.close()
os.rename('通讯录.txt', '通讯录_del.txt')
os.rename('通讯录_copy.txt', '通讯录.txt')
os.remove('通讯录_del.txt')
tkinter.messagebox.showinfo('消息提示框', f'删除“{name}“成功!')
# 注册成功关闭注册框
window_del.destroy()
else:
tkinter.messagebox.showinfo('消息提示框', '查无此人!')
else:
tkinter.messagebox.showinfo('消息提示框', '通讯录为空!')
window_del = tkinter.Toplevel(root)
window_del.geometry('300x300')
window_del.title('删除联系人')
# 输入删除的姓名
name_str = tkinter.StringVar()
tkinter.Label(window_del, text='请输入要删除的联系人名字:', font=('黑体',15,'bold')).place(x=10, y=10)
tkinter.Entry(window_del, textvariable=name_str).place(x=80, y=60)
# 确认删除按钮及位置
confirm_button = tkinter.Button(window_del, text='确认删除', font=('黑体', 15, 'bold'))
confirm_button.bind("" , delinfo)
confirm_button.place(x=100, y=180)
# 更新联系人信息
def handler_4(event):
def updateinfo(event):
name_old = name_del.get()
name = name_new .get()
phone = phone_new.get()
mail = mail_new.get()
address = address_new.get()
file = open("通讯录.txt", mode='r+', encoding='utf-8')
# 如果通讯录.txt文件不为空时,执行下面代码
if len(file.read()) != 0:
file.seek(0, 0)
file_data = file.read()
split_info = file_data.split('\n')
split_info.remove(split_info[len(split_info) - 1])
name_li = [] # 用于存储联系人姓名的列表
all_info_li = [] # 用于存储所有信息的列表
for i in split_info:
dict_info = json.loads(i.replace("\'", '\"'))
all_info_li.append(dict_info)
name_li.append(dict_info['姓名'])
if name_old in name_li:
if name != "" and phone != "" and mail != "" and address != "":
通讯录_copy = open('通讯录_copy.txt', mode='w', encoding="utf-8")
# 将数据封装到字典中
card_dict = {"姓名": name, "手机号": phone,
"邮箱": mail, "地址": address}
for person_info in all_info_li:
if name_old in str(person_info):
person_info = str(card_dict)
通讯录_copy.write(str(person_info) + '\n')
通讯录_copy.close()
file.close()
os.rename('通讯录.txt', '通讯录_del.txt')
os.rename('通讯录_copy.txt', '通讯录.txt')
os.remove('通讯录_del.txt')
tkinter.messagebox.showinfo('消息提示框', '更新成功!')
else:
tkinter.messagebox.showinfo('消息提示框', '请输入正确信息,或输入完整信息')
else:
tkinter.messagebox.showinfo('消息提示框', '查无此人')
else:
tkinter.messagebox.showinfo('消息提示框', '通讯录为空')
window_update = tkinter.Toplevel(root)
window_update.geometry('300x300')
window_update.title('修改联系人')
# 输入要更新的联系人姓名
name_del = tkinter.StringVar()
tkinter.Label(window_update, text='请输入要修改信息的联系人名字:', font=('黑体', 13, 'bold')).place(x=10, y=10)
tkinter.Entry(window_update, textvariable=name_del).place(x=80, y=40)
# 输入要更新的相关信息
name_new = tkinter.StringVar()
phone_new = tkinter.StringVar()
mail_new = tkinter.StringVar()
address_new = tkinter.StringVar()
tkinter.Label(window_update, text='请输入修改后的信息:', font=('黑体', 13, 'bold')).place(x=10, y=70)
#输入更改后的联系人信息
tkinter.Label(window_update, text='姓 名:').place(x=20, y=100)
tkinter.Entry(window_update, textvariable=name_new).place(x=80, y=100)
tkinter.Label(window_update, text='手机号:').place(x=20, y=130)
tkinter.Entry(window_update, textvariable=phone_new).place(x=80, y=130)
tkinter.Label(window_update, text='邮 箱:').place(x=20, y=160)
tkinter.Entry(window_update, textvariable=mail_new).place(x=80, y=160)
tkinter.Label(window_update, text='地 址:').place(x=20, y=190)
tkinter.Entry(window_update, textvariable=address_new).place(x=80, y=190)
# 确认按钮
confirm_button = tkinter.Button(window_update, text='确认修改', font=('黑体', 15, 'bold'))
confirm_button.bind("" , updateinfo)
confirm_button.place(x=100, y=250)
# 查找联系人信息
def handler_5(event):
def findinfo(event):
name = name_find.get()
file = open("通讯录.txt", mode='r', encoding='utf-8')
# 如果通讯录.txt文件不为空时,执行下面代码
if len(file.read()) != 0:
file.seek(0, 0)
file_data = file.read()
split_info = file_data.split('\n')
split_info.remove(split_info[len(split_info) - 1])
name_li = [] # 用于存储联系人姓名的列表
all_info_li = [] # 用于存储所有信息的列表
for i in split_info:
dict_info = json.loads(i.replace("\'", '\"'))
all_info_li.append(dict_info)
name_li.append(dict_info['姓名'])
if name in name_li:
for person_info in all_info_li:
if name in str(person_info):
# 创建一个frame显示框
Frame_info = tkinter.Frame(window_find, height=150, width=180)
Frame_info.place(x=20, y=80)
for title, info_value in person_info.items():
tem_text = title+":"+info_value+" "*30
tktest = tkinter.Label(Frame_info, text=tem_text, font=('黑体', 13, 'bold'))
tktest .pack(side="top", anchor='w')
else:
tkinter.messagebox.showinfo('消息提示框', '查无此人')
else:
tkinter.messagebox.showinfo('消息提示框', '通讯录为空')
window_find = tkinter.Toplevel(root)
window_find.geometry('300x300')
window_find.title('修改联系人')
# 输入要更新的联系人姓名
name_find = tkinter.StringVar()
tkinter.Label(window_find, text='请输入要查询的联系人名字:', font=('黑体', 13, 'bold')).place(x=10, y=10)
tkinter.Entry(window_find, textvariable=name_find).place(x=80, y=40)
# 确认按钮
confirm_button = tkinter.Button(window_find, text='确认查询', font=('黑体', 15, 'bold'))
confirm_button.bind("" , findinfo)
confirm_button.place(x=100, y=250)
# 退出
def handler_6(event):
root.destroy()
# 添加联系人
button1 = tkinter.Button(root, text="1.添加联系人", width=20, font=('黑体',15,'bold'))
button1.place(x=208,y=50)
button1.bind('' , handler_1)
# 查看通讯录
button2 = tkinter.Button(root, text="2.查看通讯录", width=20, font=('黑体', 15, 'bold'))
button2.place(x=208, y=130)
button2.bind('' , handler_2)
# 删除联系人
button3 = tkinter.Button(root, text="3.删除联系人", width=20, font=('黑体', 15, 'bold'))
button3.place(x=208, y=210)
button3.bind('' , handler_3)
# 修改联系人
button4 = tkinter.Button(root, text="4.修改联系人", width=20, font=('黑体', 15, 'bold'))
button4.place(x=208, y=290)
button4.bind('' , handler_4)
# 查找联系人
button5 = tkinter.Button(root, text="5.查找联系人", width=20, font=('黑体', 15, 'bold'))
button5.place(x=208, y=370)
button5.bind('' , handler_5)
# 退出
button6 = tkinter.Button(root, text="6. 退出 ", width=20, font=('黑体', 15, 'bold'))
button6.place(x=208, y=450)
button6.bind('' , handler_6)
root.mainloop() # 显示主窗体
def main():#主函数
MainForm()#实例化窗体类
if __name__=='__main__':#判断程序执行名称
main()#调用主函数