Python通讯录管理系统:多通讯录、现代科技感、数据导入导出

ChatGPT4o 使用 ChatGPT 4o 回答

问题:

请用python为我写个用于管理多套通讯录的代码,要求如下:可以存储联系人和电话号码以及备注,可以删除联系人,可以创建多个通讯录或删除,并用下拉菜单显示,在选择下拉菜单后,在图形界面的右侧实时显示该通讯录内已存储的联系人,图形界面要求现代科技感,以蓝白色为基础,还需要一个用于导出已保存数据用于备份,以及导入备份数据的选项,窗口居中显示,为了美观要隐藏控制台,在退出或删除等容易误操作的选项上要有提醒确定选项,例如关闭软件要提示:“确定退出吗?”,删除通讯录或联系人要提示:“删除数据无法恢复,确定删除吗?” 窗口内文字显示的范围随窗口大小按比例同步缩放,“创建通讯录”,“添加联系人”还有“删除通讯录”,“删除联系人”按钮旁边要有窗口输入文字,并且,输入窗口和显示已录入数据的窗口要分开,姓名右面紧挨着一个输入框,电话右面紧挨着一个输入框,备注右面紧挨着一个输入框,且排列紧凑美观,上条作废,请重新设计,要求多花点时间严密思考,逻辑清晰,正确无误。 多生成几个并从中选取最好的输出给我。

回答:

好的,我会为你设计一个符合要求的通讯录管理系统。这个系统将使用Python的Tkinter库来创建图形用户界面,并使用JSON文件来存储和导入/导出数据。以下是一个详细的设计和实现:

设计思路

  1. 主界面

    • 包含一个下拉菜单用于选择通讯录。
    • 右侧显示当前选中的通讯录中的联系人列表。
    • 按钮用于创建、删除通讯录和联系人。
    • 输入框用于输入联系人信息(姓名、电话、备注)。
  2. 功能

    • 创建、删除通讯录。
    • 添加、删��联系人。
    • 导入、导出通讯录数据。
    • 确认对话框用于重要操作(如删除���退出)。
  3. 界面风格

    • 现代科技感,以蓝白色为基础。
    • 窗口居中显示,文字随窗口大小按比例缩放。

实现代码

import tkinter as tk
from tkinter import ttk, messagebox, filedialog
import json
import os

class ContactManager:
    def __init__(self, root):
        self.root = root
        self.root.title("通讯录管理系统")
        self.root.geometry("800x600")
        self.root.configure(bg="#f0f8ff")
        self.root.eval('tk::PlaceWindow . center')
        
        self.contacts_data = {}
        self.current_book = None
        
        self.create_widgets()
        self.load_data()

    def create_widgets(self):
        # 下拉菜单
        self.book_var = tk.StringVar()
        self.book_menu = ttk.Combobox(self.root, textvariable=self.book_var, state="readonly")
        self.book_menu.bind("<<ComboboxSelected>>", self.display_contacts)
        self.book_menu.pack(pady=10)
        
        # 按钮
        button_frame = tk.Frame(self.root, bg="#f0f8ff")
        button_frame.pack(pady=10)
        
        self.create_book_button = tk.Button(button_frame, text="创建通讯录", command=self.create_book)
        self.create_book_button.grid(row=0, column=0, padx=5)
        
        self.delete_book_button = tk.Button(button_frame, text="删除通讯录", command=self.delete_book)
        self.delete_book_button.grid(row=0, column=1, padx=5)
        
        self.add_contact_button = tk.Button(button_frame, text="添加联系人", command=self.add_contact)
        self.add_contact_button.grid(row=0, column=2, padx=5)
        
        self.delete_contact_button = tk.Button(button_frame, text="删除联系人", command=self.delete_contact)
        self.delete_contact_button.grid(row=0, column=3, padx=5)
        
        self.export_button = tk.Button(button_frame, text="导出数据", command=self.export_data)
        self.export_button.grid(row=0, column=4, padx=5)
        
        self.import_button = tk.Button(button_frame, text="导入数据", command=self.import_data)
        self.import_button.grid(row=0, column=5, padx=5)
        
        # 联系人列表
        self.contact_listbox = tk.Listbox(self.root)
        self.contact_listbox.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        # 输入框
        input_frame = tk.Frame(self.root, bg="#f0f8ff")
        input_frame.pack(pady=10)
        
        tk.Label(input_frame, text="姓名:", bg="#f0f8ff").grid(row=0, column=0, padx=5)
        self.name_entry = tk.Entry(input_frame)
        self.name_entry.grid(row=0, column=1, padx=5)
        
        tk.Label(input_frame, text="电话:", bg="#f0f8ff").grid(row=0, column=2, padx=5)
        self.phone_entry = tk.Entry(input_frame)
        self.phone_entry.grid(row=0, column=3, padx=5)
        
        tk.Label(input_frame, text="备注:", bg="#f0f8ff").grid(row=0, column=4, padx=5)
        self.note_entry = tk.Entry(input_frame)
        self.note_entry.grid(row=0, column=5, padx=5)
        
        self.root.protocol("WM_DELETE_WINDOW", self.on_closing)

    def load_data(self):
        if os.path.exists("contacts.json"):
            with open("contacts.json", "r", encoding="utf-8") as file:
                self.contacts_data = json.load(file)
            self.update_book_menu()

    def save_data(self):
        with open("contacts.json", "w", encoding="utf-8") as file:
            json.dump(self.contacts_data, file, ensure_ascii=False, indent=4)

    def update_book_menu(self):
        self.book_menu['values'] = list(self.contacts_data.keys())
        if self.book_menu['values']:
            self.book_menu.current(0)
            self.display_contacts()

    def display_contacts(self, event=None):
        self.current_book = self.book_var.get()
        self.contact_listbox.delete(0, tk.END)
        if self.current_book:
            for contact in self.contacts_data[self.current_book]:
                self.contact_listbox.insert(tk.END, f"{contact['name']} - {contact['phone']} - {contact['note']}")

    def create_book(self):
        book_name = tk.simpledialog.askstring("创建通讯录", "请输入通讯录名称:")
        if book_name:
            if book_name in self.contacts_data:
                messagebox.showerror("错误", "通讯录已存在!")
            else:
                self.contacts_data[book_name] = []
                self.update_book_menu()
                self.save_data()

    def delete_book(self):
        if self.current_book:
            if messagebox.askyesno("确认删除", "删除数据无法恢复,确定删除吗?"):
                del self.contacts_data[self.current_book]
                self.update_book_menu()
                self.save_data()

    def add_contact(self):
        name = self.name_entry.get()
        phone = self.phone_entry.get()
        note = self.note_entry.get()
        if name and phone:
            self.contacts_data[self.current_book].append({"name": name, "phone": phone, "note": note})
            self.display_contacts()
            self.save_data()
        else:
            messagebox.showerror("错误", "姓名和电话不能为空!")

    def delete_contact(self):
        selected_contact = self.contact_listbox.curselection()
        if selected_contact:
            if messagebox.askyesno("确认删除", "删除数据无法恢复,确定删除吗?"):
                del self.contacts_data[self.current_book][selected_contact[0]]
                self.display_contacts()
                self.save_data()

    def export_data(self):
        file_path = filedialog.asksaveasfilename(defaultextension=".json", filetypes=[("JSON files", "*.json")])
        if file_path:
            with open(file_path, "w", encoding="utf-8") as file:
                json.dump(self.contacts_data, file, ensure_ascii=False, indent=4)

    def import_data(self):
        file_path = filedialog.askopenfilename(filetypes=[("JSON files", "*.json")])
        if file_path:
            with open(file_path, "r", encoding="utf-8") as file:
                self.contacts_data = json.load(file)
            self.update_book_menu()
            self.save_data()

    def on_closing(self):
        if messagebox.askokcancel("退出", "确定退出吗?"):
            self.root.destroy()

if __name__ == "__main__":
    root = tk.Tk()
    app = ContactManager(root)
    root.mainloop()

说明

  1. 主界面:使用Tkinter创建了一个主窗口,包含下拉菜单、按钮、联系人列表和输入框。
  2. 功能实现
    • create_book:创建新的通讯录。
    • delete_book:删除选中的通讯录。
    • add_contact:添加联系人到当前选中的通讯录。
    • delete_contact:删除选中的联系人。
    • export_data:导出通讯录数据到JSON文件。
    • import_data:从JSON文件导入通讯录数据。
  3. 数据存储:使用JSON文件存储通讯录数据���程序启动时加载数据,退出时保存数据。
  4. 确认对话框:在删除和退出操作时弹出确认对话框,防止误操作。

这个设��和实现应该能够满足你的需求。如果有任何进一步的要求或修改,请告诉我。