import customtkinter as ctk
import tkinter as tk
import pandas as pd
from PIL import Image, ImageTk
import os
import webbrowser
import subprocess
# Lire les données depuis le fichier Excel
excel_path = 'E:/boss/VATOBE/pierres_precieuses.xlsx'
df = pd.read_excel(excel_path)
# Créer la fenêtre principale
root = ctk.CTk()
root.title("Bibliothèque des Pierres Précieuses")
root.geometry("1000x750")
# Créer un cadre pour afficher les informations
frame = ctk.CTkFrame(root, fg_color="#f5f5f5", corner_radius=15)
frame.grid(row=0, column=2, columnspan=3, padx=20, pady=20, sticky="nsew")
# Fonction pour afficher les informations d'une pierre
def afficher_pierre(pierre):
# Effacer les widgets existants dans le cadre
for widget in frame.winfo_children():
widget.destroy()
# Récupérer le nom, le chemin de la photo, le chemin du fichier txt et les coordonnées
nom = pierre['Nom']
photo_path = pierre['Photo']
txt_path = pierre['txt']
coordonnees = pierre['Coordonnées']
# Afficher le nom de la pierre
label_nom = ctk.CTkLabel(frame, text=nom, font=("Helvetica", 24, "bold"), text_color="#333333")
label_nom.grid(row=0, column=0, columnspan=2, pady=10)
# Afficher la photo de la pierre
if os.path.exists(photo_path):
img = Image.open(photo_path)
img = img.resize((250, 250), Image.LANCZOS)
photo = ImageTk.PhotoImage(img)
label_photo = ctk.CTkLabel(frame, image=photo)
label_photo.image = photo
label_photo.grid(row=1, column=0, pady=10, padx=10)
else:
label_photo = ctk.CTkLabel(frame, text="Photo non trouvée", font=("Arial", 14),
text_color="red")
label_photo.grid(row=1, column=0, pady=10, padx=10)
# Afficher le contenu du fichier .txt
if os.path.exists(txt_path):
try:
with open(txt_path, 'r', encoding='utf-8') as file:
text_content = file.read()
except UnicodeDecodeError:
with open(txt_path, 'r', encoding='latin-1') as file:
text_content = file.read()
text_box = tk.Text(frame, wrap='word', height=15, width=40, bg="#e8e8e8", fg="#333333",
font=("Helvetica", 14), padx=10, pady=10)
text_box.insert(tk.END, text_content)
text_box.grid(row=1, column=1, pady=10, padx=10)
text_box.configure(state='disabled') # Rendre le texte non modifiable
else:
label_txt = ctk.CTkLabel(frame, text="Fichier TXT non trouvé", font=("Arial", 14),
text_color="red")
label_txt.grid(row=1, column=1, pady=10, padx=10)
# Afficher les coordonnées avec un lien pour ouvrir dans Google Maps
def ouvrir_google_maps():
url = f"https://www.google.com/maps?q={coordonnees}"
webbrowser.open(url)
if pd.notna(coordonnees):
label_coordonnees = ctk.CTkLabel(frame, text="Coordonnées: " + coordonnees, font=("Arial",
14), text_color="#007acc", cursor="hand2")
label_coordonnees.grid(row=2, column=0, pady=10)
label_coordonnees.bind("<Button-1>", lambda e: ouvrir_google_maps())
else:
label_coordonnees = ctk.CTkLabel(frame, text="Coordonnées non disponibles", font=("Arial",
14), text_color="red")
label_coordonnees.grid(row=2, column=0, pady=10)
# Fonction pour rechercher et afficher une pierre
def rechercher_pierre():
nom_recherche = entry_recherche.get().strip().lower()
pierre = df[df['Nom'].str.lower() == nom_recherche]
if not pierre.empty:
afficher_pierre(pierre.iloc[0])
else:
for widget in frame.winfo_children():
widget.destroy()
label_erreur = ctk.CTkLabel(frame, text="Pierre non trouvée", font=("Arial", 14),
text_color="red")
label_erreur.grid(row=4, column=0, pady=10)
# Fonction pour ouvrir le fichier Excel
def ouvrir_excel():
subprocess.Popen(["start", excel_path], shell=True)
# Ajouter une Listbox pour sélectionner une pierre (Tkinter Listbox)
listbox = tk.Listbox(root, height=20, width=30, font=("Helvetica", 14), bg="#f0f0f0", fg="#333333")
listbox.grid(row=0, column=0, padx=10, pady=10, sticky="nsew")
# Ajouter les noms des pierres dans la Listbox
for pierre in df['Nom']:
listbox.insert("end", pierre)
# Fonction pour afficher les informations lorsque l'utilisateur sélectionne un nom dans la Listbox
def on_listbox_select(event):
selected_index = listbox.curselection() # Récupérer l'indice sélectionné
if selected_index:
selected_value = listbox.get(selected_index) # Récupérer la valeur sélectionnée
pierre = df[df['Nom'] == selected_value]
if not pierre.empty:
afficher_pierre(pierre.iloc[0])
# Lier la sélection de la Listbox à la fonction on_listbox_select
listbox.bind("<<ListboxSelect>>", on_listbox_select)
# Ajouter un champ de saisie pour la recherche
entry_recherche = ctk.CTkEntry(root, fg_color="#ffffff", text_color="black", corner_radius=10,
font=("Helvetica", 14))
entry_recherche.grid(row=2, column=0, pady=10, padx=10)
# Ajouter un bouton pour déclencher la recherche
bouton_recherche = ctk.CTkButton(root, text="Rechercher", command=rechercher_pierre,
fg_color="#007acc", text_color="white", corner_radius=10, font=("Helvetica", 14))
bouton_recherche.grid(row=2, column=1, pady=10, padx=10)
# Ajouter un bouton pour ouvrir le fichier Excel
bouton_ajouter = ctk.CTkButton(root, text="Ajouter", command=ouvrir_excel, fg_color="#007acc",
text_color="white", corner_radius=10, font=("Helvetica", 14))
bouton_ajouter.grid(row=3, column=0, pady=10, padx=10)
# Démarrer l'interface graphique
root.mainloop()