import tkinter as tk
from tkinter import messagebox
from tkinter import simpledialog
import os
import json
# Файлы для хранения данных
TEXT_FILE = "contacts.txt" # Хранит ФИО, Код контакта, описание
TYPE_FILE = "numbers.json" # Хранит Код контакта, номера телефонов, описание категории
# Утилиты для работы с файлами
def load_data():
if not os.path.exists(TEXT_FILE):
with open(TEXT_FILE, "w") as f:
f.write("")
if not os.path.exists(TYPE_FILE):
with open(TYPE_FILE, "w") as f:
json.dump({}, f)
with open(TEXT_FILE, "r") as f:
text_data = [line.strip().split(",") for line in f if line.strip()]
with open(TYPE_FILE, "r") as f:
type_data = json.load(f)
return text_data, type_data
def save_type_data(data):
with open(TYPE_FILE, "w") as f:
json.dump(data, f)
# Статистика
def show_statistics(text_data, type_data):
num_contacts = len(text_data)
num_numbers = sum(len(numbers["phones"]) for numbers in type_data.values())
messagebox.showinfo("Статистика", f"Контактов: {num_contacts}\nНомеров телефонов: {num_numbers}")
# Добавление контакта
def add_contact():
fio = simpledialog.askstring("Добавить контакт", "Введите ФИО:")
if not fio:
return
code = simpledialog.askstring("Добавить контакт", "Введите код контакта:")
if not code:
return
description = simpledialog.askstring("Добавить контакт", "Введите описание:")
if not description:
return
with open(TEXT_FILE, "a") as f:
f.write(f"{fio},{code},{description}\n")
phone = simpledialog.askstring("Добавить номер", "Введите номер телефона:")
if phone:
category = simpledialog.askstring("Добавить номер", "Введите описание категории:")
with open(TYPE_FILE, "r") as f:
type_data = json.load(f)
type_data[code] = {"phones": [phone], "category": category}
save_type_data(type_data)
messagebox.showinfo("Успех", "Контакт успешно добавлен!")
# Добавление номера
def add_number():
code = simpledialog.askstring("Добавить номер", "Введите код контакта:")
if not code:
return
phone = simpledialog.askstring("Добавить номер", "Введите номер телефона:")
if not phone:
return
category = simpledialog.askstring("Добавить номер", "Введите описание категории:")
with open(TYPE_FILE, "r") as f:
type_data = json.load(f)
if code in type_data:
type_data[code]["phones"].append(phone)
save_type_data(type_data)
messagebox.showinfo("Успех", "Номер успешно добавлен!")
else:
messagebox.showerror("Ошибка", "Контакт с таким кодом не найден!")
# Поиск номеров по ФИО
def search_numbers():
search_type = simpledialog.askstring("Поиск номеров", "Введите тип поиска (ФИО/Имя/Фамилия):")
if not search_type:
return
search_value = simpledialog.askstring("Поиск номеров", "Введите значение для поиска:")
if not search_value:
return
with open(TEXT_FILE, "r") as f:
text_data = [line.strip().split(",") for line in f if line.strip()]
results = []
for fio, code, _ in text_data:
if (search_type.lower() == "фио" and search_value.lower() in fio.lower()) or \
(search_type.lower() in ["имя", "фамилия"] and search_value.lower() in fio.split()[0].lower()):
with open(TYPE_FILE, "r") as f:
type_data = json.load(f)
if code in type_data:
results.append(f"Контакт: {fio}, Номера: {', '.join(type_data[code]['phones'])}")
if results:
messagebox.showinfo("Результаты поиска", "\n".join(results))
else:
messagebox.showinfo("Результаты поиска", "Контактов не найдено!")
# Редактирование номера
def edit_number():
code = simpledialog.askstring("Редактировать номер", "Введите код контакта:")
if not code:
return
phone = simpledialog.askstring("Редактировать номер", "Введите номер телефона для редактирования:")
if not phone:
return
with open(TYPE_FILE, "r") as f:
type_data = json.load(f)
if code in type_data and phone in type_data[code]["phones"]:
new_phone = simpledialog.askstring("Редактировать номер", "Введите новый номер:")
if new_phone:
index = type_data[code]["phones"].index(phone)
type_data[code]["phones"][index] = new_phone
save_type_data(type_data)
messagebox.showinfo("Успех", "Номер успешно отредактирован!")
else:
messagebox.showerror("Ошибка", "Новый номер не введен!")
else:
messagebox.showerror("Ошибка", "Номер не найден!")
# Интерфейс программы
load_data()
root = tk.Tk()
root.title("Телефонный справочник")
tk.Button(root, text="Показать статистику", command=lambda: show_statistics(*load_data())).pack(pady=5)
tk.Button(root, text="Добавить контакт", command=add_contact).pack(pady=5)
tk.Button(root, text="Добавить номер", command=add_number).pack(pady=5)
tk.Button(root, text="Найти номера", command=search_numbers).pack(pady=5)
tk.Button(root, text="Редактировать номер", command=edit_number).pack(pady=5)
root.mainloop()