Python 实例:手机通讯录(使用GUI图形界面并用text文本记录数据)

在使用text文本的通讯录的基础之上进行了改进
使用GUI图形界面
之后打算再研究一下用数据库记录数据
上篇的通讯录PythonPython 实例:手机通讯录(使用text文本记录数据)
下面是运行截图:
Python 实例:手机通讯录(使用GUI图形界面并用text文本记录数据)_第1张图片
Python 实例:手机通讯录(使用GUI图形界面并用text文本记录数据)_第2张图片
Python 实例:手机通讯录(使用GUI图形界面并用text文本记录数据)_第3张图片
Python 实例:手机通讯录(使用GUI图形界面并用text文本记录数据)_第4张图片Python 实例:手机通讯录(使用GUI图形界面并用text文本记录数据)_第5张图片Python 实例:手机通讯录(使用GUI图形界面并用text文本记录数据)_第6张图片
Python 实例:手机通讯录(使用GUI图形界面并用text文本记录数据)_第7张图片
还有很多细节就不一,一演示了
单纯应付一下期末的作业
代码直接复制粘贴运行就可以使用了

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()#调用主函数

你可能感兴趣的:(作业,python)