import tkinter as tk #Sert à la création d'interfaces from tkinter import messagebox import os #Pour les opérations relatives aux chemins et les emplacements des fichiers import matplotlib.pyplot as plt #Pour les créations de grahiques import shutil #Utilisé pour la copie et le déplacement de fichiers import xml.etree.ElementTree as ET #Pour l'intéraction avec Inkscape import base64 import numpy as np #Bibliothèque mathématique import sys import json import glob import time ## liste des 118 éléments avec Numéro, Symbole, Noms en anglais, français, chinois, russe et espagnol. Les deux nombres ensuite sont les coordonnés dans le tableau. elements = [ (1, "H", ("Hydrogen","Hydrogène","氢","الهيدروجين","Водород","Hidrógeno"), 1, 1), (2, "He", ("Helium","Hélium","氦","الهيليوم","Гелий","Helio"), 18, 1), (3, "Li", ("Lithium","Lithium","锂","الليثيوم","Литий","Litio"), 1, 2), (4, "Be", ("Beryllium","Béryllium","铍","البريليوم","Бериллий","Berilio"), 2, 2), (5, "B", ("Boron","Bore","硼","البورون","Бор","Boro"), 13, 2), (6, "C", ("Carbon","Carbone","碳","الكربون","Углерод","Carbono"), 14, 2), (7, "N", ("Nitrogen","Azote","氮","النيتروجين","Азот","Nitrógeno"), 15, 2), (8, "O", ("Oxygen","Oxygène","氧","الأكسجين","Кислород","Oxígeno"), 16, 2), (9, "F", ("Fluorine","Fluor","氟","الفلور","Фтор","Flúor"), 17, 2), (10, "Ne", ("Neon","Néon","氖","النيون","Неон","Neón"), 18, 2), (11, "Na", ("Sodium","Sodium","钠","الصوديوم","Натрий","Sodio"), 1, 3), (12, "Mg", ("Magnesium","Magnésium","镁","المغنيسيوم","Магний","Magnesio"), 2, 3), (13, "Al", ("Aluminum","Aluminium","铝","الألومنيوم","Алюминий","Aluminio"), 13, 3), (14, "Si", ("Silicon","Silicium","硅","السيليكون","Кремний","Silicio"), 14, 3), (15, "P", ("Phosphorus","Phosphore","磷","الفوسفور","Фосфор","Fósforo"), 15, 3), (16, "S", ("Sulfur","Soufre","硫","الكبريت","Сера","Azufre"), 16, 3), (17, "Cl", ("Chlorine","Chlore","氯","الكلور","Хлор","Cloro"), 17, 3), (18, "Ar", ("Argon","Argon","氩","الأرجون","Аргон","Argón"), 18, 3), (19, "K", ("Potassium","Potassium","钾","البوتاسيوم","Калий","Potasio"), 1, 4), (20, "Ca", ("Calcium","Calcium","钙","الكالسيوم","Кальций","Calcio"), 2, 4), (21, "Sc", ("Scandium","Scandium","钪","الإسكنديوم","Скандий","Escandio"), 3, 4), (22, "Ti", ("Titanium","Titane","钛","التيتانيوم","Титан","Titanio"), 4, 4), (23, "V", ("Vanadium","Vanadium","钒","الفاناديوم","Ванадий","Vanadio"), 5, 4), (24, "Cr", ("Chromium","Chrome","铬","الكروم","Хром","Cromo"), 6, 4), (25, "Mn", ("Manganese","Manganèse","锰","المنغنيز","Марганец","Manganeso"), 7, 4), (26, "Fe", ("Iron","Fer","铁","الحديد","Железо","Hierro"), 8, 4), (27, "Co", ("Cobalt","Cobalt","钴","الكوبالت","Кобальт","Cobalto"), 9, 4), (28, "Ni", ("Nickel","Nickel","镍","النيكل","Никель","Níquel"), 10, 4), (29, "Cu", ("Copper","Cuivre","铜","النحاس","Медь","Cobre"), 11, 4), (30, "Zn", ("Zinc","Zinc","锌","الزنك","Цинк","Zinc"), 12, 4), (31, "Ga", ("Gallium","Gallium","镓","الغاليوم","Галлий","Galio"), 13, 4), (32, "Ge", ("Germanium","Germanium","锗","الجرمانيوم","Германий","Germanio"), 14, 4), (33, "As", ("Arsenic","Arsenic","砷","الزرنيخ","Мышьяк","Arsénico"), 15, 4), (34, "Se", ("Selenium","Sélénium","硒","السيلينيوم","Селен","Selenio"), 16, 4), (35, "Br", ("Bromine","Brome","溴","البروم","Бром","Bromo"), 17, 4), (36, "Kr", ("Krypton","Krypton","氪","الكريبتون","Криптон","Kriptón"), 18, 4), (37, "Rb", ("Rubidium","Rubidium","铷","الروبيديوم","Рубидий","Rubidio"), 1, 5), (38, "Sr", ("Strontium","Strontium","锶","السترونشيوم","Стронций","Estroncio"), 2, 5), (39, "Y", ("Yttrium","Yttrium","钇","الإيتريوم","Иттрий","Itrio"), 3, 5), (40, "Zr", ("Zirconium","Zirconium","锆","الزركونيوم","Цирконий","Circonio"), 4, 5), (41, "Nb", ("Niobium","Niobium","铌","النيوبيوم","Ниобий","Niobio"), 5, 5), (42, "Mo", ("Molybdenum","Molybdène","钼","الموليبدينوم","Молибден","Molibdeno"), 6, 5), (43, "Tc", ("Technetium","Technétium","锝","التكنيتيوم","Технеций","Tecnecio"), 7, 5), (44, "Ru", ("Ruthenium","Ruthénium","钌","الروثينيوم","Рутений","Rutenio"), 8, 5), (45, "Rh", ("Rhodium","Rhodium","铑","الروديوم","Родий","Rodio"), 9, 5), (46, "Pd", ("Palladium","Palladium","钯","البلاديوم","Палладий","Paladio"), 10, 5), (47, "Ag", ("Silver","Argent","银","الفضة","Серебро","Plata"), 11, 5), (48, "Cd", ("Cadmium","Cadmium","镉","الكادميوم","Кадмий","Cadmio"), 12, 5), (49, "In", ("Indium","Indium","铟","الإنديوم","Индий","Indio"), 13, 5), (50, "Sn", ("Tin","Étain","锡","القصدير","Олово","Estaño"), 14, 5), (51, "Sb", ("Antimony","Antimoine","锑","الأنتيمون","Сурьма","Antimonio"), 15, 5), (52, "Te", ("Tellurium","Tellure","碲","التيلوريوم","Теллур","Telurio"), 16, 5), (53, "I", ("Iodine","Iode","碘","اليود","Йод","Yodo"), 17, 5), (54, "Xe", ("Xenon","Xénon","氙","الزينون","Ксенон","Xenón"), 18, 5), (55, "Cs", ("Cesium","Césium","铯","السيزيوم","Цезий","Cesio"), 1, 6), (56, "Ba", ("Barium","Baryum","钡","الباريوم","Барий","Bario"), 2, 6), # Lanthanides (57, "La", ("Lanthanum","Lanthane","镧","اللانثانوم","Лантан","Lantano"), 3, 9), (58, "Ce", ("Cerium","Cérium","铈","السيريوم","Церий","Cerio"), 4, 9), (59, "Pr", ("Praseodymium","Praséodyme","镨","البراسيوديميوم","Празеодим","Praseodimio"), 5, 9), (60, "Nd", ("Neodymium","Néodyme","钕","النيوديميوم","Неодим","Neodimio"), 6, 9), (61, "Pm", ("Promethium","Prométhium","钷","البروميثيوم","Прометий","Prometio"), 7, 9), (62, "Sm", ("Samarium","Samarium","钐","الساماريوم","Самарий","Samario"), 8, 9), (63, "Eu", ("Europium","Europium","铕","اليوروبيوم","Европий","Europio"), 9, 9), (64, "Gd", ("Gadolinium","Gadolinium","钆","الغادولينيوم","Гадолиний","Gadolinio"), 10, 9), (65, "Tb", ("Terbium","Terbium","铽","التيربيوم","Тербий","Terbio"), 11, 9), (66, "Dy", ("Dysprosium","Dysprosium","镝","الديسبروسيوم","Диспрозий","Disprosio"), 12, 9), (67, "Ho", ("Holmium","Holmium","钬","الهولميوم","Гольмий","Holmio"), 13, 9), (68, "Er", ("Erbium","Erbium","铒","الإربيوم","Эрбий","Erbio"), 14, 9), (69, "Tm", ("Thulium","Thulium","铥","الثوليوم","Туллий","Tulio"), 15, 9), (70, "Yb", ("Ytterbium","Ytterbium","镱","الإيتربيوم","Иттербий","Iterbio"), 16, 9), (71, "Lu", ("Lutetium","Lutécium","镥","اللوتيتيوم","Лютеций","Lutecio"), 17, 9), (72, "Hf", ("Hafnium","Hafnium","铪","الهافنيوم","Гафний","Hafnio"), 4, 6), (73, "Ta", ("Tantalum","Tantale","钽","التنتالوم","Тантал","Tantalio"), 5, 6), (74, "W", ("Tungsten","Tungstène","钨","التنغستن","Вольфрам","Wolframio"), 6, 6), (75, "Re", ("Rhenium","Rhénium","铼","الرينيوم","Рений","Renio"), 7, 6), (76, "Os", ("Osmium","Osmium","锇","الأوزميوم","Осмий","Osmio"), 8, 6), (77, "Ir", ("Iridium","Iridium","铱","الإيريديوم","Иридий","Iridio"), 9, 6), (78, "Pt", ("Platinum","Platine","铂","البلاتين","Платина","Platino"), 10, 6), (79, "Au", ("Gold","Or","金","الذهب","Золото","Oro"), 11, 6), (80, "Hg", ("Mercury","Mercure","汞","الزئبق","Ртуть","Mercurio"), 12, 6), (81, "Tl", ("Thallium","Thallium","铊","الثاليوم","Таллий","Talio"), 13, 6), (82, "Pb", ("Lead","Plomb","铅","الرصاص","Свинец","Plomo"), 14, 6), (83, "Bi", ("Bismuth","Bismuth","铋","البزموت","Висмут","Bismuto"), 15, 6), (84, "Po", ("Polonium","Polonium","钋","البولونيوم","Полоний","Polonio"), 16, 6), (85, "At", ("Astatine","Astate","砹","الأستاتين","Астат","Astato"), 17, 6), (86, "Rn", ("Radon","Radon","氡","الرادون","Радон","Radón"), 18, 6), (87, "Fr", ("Francium","Francium","钫","الفرانسيوم","Франций","Francio"), 1, 7), (88, "Ra", ("Radium","Radium","镭","الراديوم","Радий","Radio"), 2, 7), # Actinides (89, "Ac", ("Actinium","Actinium","锕","الأكتينيوم","Актиний","Actinio"), 3, 10), (90, "Th", ("Thorium","Thorium","钍","الثوريوم","Торий","Torio"), 4, 10), (91, "Pa", ("Protactinium","Protactinium","镤","البروتاكتينيوم","Протактиний","Protactinio"), 5, 10), (92, "U", ("Uranium","Uranium","铀","اليورانيوم","Уран","Uranio"), 6, 10), (93, "Np", ("Neptunium","Neptunium","镎","النيبتونيوم","Нептуний","Neptunio"), 7, 10), (94, "Pu", ("Plutonium","Plutonium","钚","البلوتونيوم","Плутоний","Plutonio"), 8, 10), (95, "Am", ("Americium","Américium","镅","الأميريكيوم","Америций","Americio"), 9, 10), (96, "Cm", ("Curium","Curium","锔","الكوريوم","Кюрий","Curio"), 10, 10), (97, "Bk", ("Berkelium","Berkelium","锫","البركيليوم","Берклий","Berkelio"), 11, 10), (98, "Cf", ("Californium","Californium","锎","الكاليفورنيوم","Калифорний","Californio"), 12, 10), (99, "Es", ("Einsteinium","Einsteinium","锿","الآينشتينيوم","Эйнштейний","Einsteinio"), 13, 10), (100, "Fm", ("Fermium","Fermium","镄","الفرميوم","Фермий","Fermio"), 14, 10), (101, "Md", ("Mendelevium","Mendélévium","钔","المندليفيوم","Менделевий","Mendelevio"), 15, 10), (102, "No", ("Nobelium","Nobélium","锘","النوبليوم","Нобелий","Nobelio"), 16, 10), (103, "Lr", ("Lawrencium","Lawrencium","铹","اللورنسيوم","Лоуренсий","Laurencio"), 17, 10), (104, "Rf", ("Rutherfordium","Rutherfordium","𬬭","الرذرفورديوم","Резерфордий","Rutherfordio"), 4, 7), (105, "Db", ("Dubnium","Dubnium","𬭊","الدوبنيوم","Дубний","Dubnio"), 5, 7), (106, "Sg", ("Seaborgium","Seaborgium","𬭳","السيبورغيوم","Сиборгий","Seaborgio"), 6, 7), (107, "Bh", ("Bohrium","Bohrium","𬭛","البوهريوم","Борий","Bohrio"), 7, 7), (108, "Hs", ("Hassium","Hassium","𬭶","الهسيوم","Хассий","Hassio"), 8, 7), (109, "Mt", ("Meitnerium","Meitnerium","𬭸","الميتنيريوم","Мейтнерий","Meitnerio"), 9, 7), (110, "Ds", ("Darmstadtium","Darmstadtium","𬭼","دارمشتاتيوم","Дармштадтий","Darmstadtio"), 10, 7), (111, "Rg", ("Roentgenium","Roentgenium","𬭩","الرونتجينيوم","Рентгений","Roentgenio"), 11, 7), (112, "Cn", ("Copernicium","Copernicium","𬭳","الكوبرنيسيوم","Коперниций","Copernicio"), 12, 7), (113, "Nh", ("Nihonium","Nihonium","𬭭","النيهونيوم","Нихоний","Nihonio"), 13, 7), (114, "Fl", ("Flerovium","Flérovium","𬭫","الفليروفيوم","Флеровий","Flerovio"), 14, 7), (115, "Mc", ("Moscovium","Moscovium","𬭬","الموسكوفيوم","Московий","Moscovio"), 15, 7), (116, "Lv", ("Livermorium","Livermorium","𬭳","الليفرموريوم","Ливерморий","Livermorio"), 16, 7), (117, "Ts", ("Tennessine","Tennessine","𬭸","التينيسين","Теннессин","Tenesino"), 17, 7), (118, "Og", ("Oganesson","Oganesson","𬭛","الأوجانيسون","Оганессон","Oganesón"), 18, 7) ] def get_last_json(folder="."): # récupère le dernier .json crée dans le dossier # récupére tous les fichiers .json dans le dossier files = glob.glob(os.path.join(folder, "*.json")) if not files: return None # aucun fichier trouvé # trie par date de modification (du plus récent au plus ancien) files.sort(key=os.path.getmtime, reverse=True) return files[0] # le plus récent ## Donne la configuration électronique en fonction du nombre d'électron Z donné. def Config(Z): orbitales = ["1s", "2s", "2p", "3s", "3p", "4s","3d", "4p", "5s", "4d", "5p", "6s","4f", "5d", "6p", "7s", "5f", "6d", "7p"] max_elec = {"s": 2,"p": 6,"d": 10,"f": 14} #bombre max d'électrons par couche config = [] reste = Z for orb in orbitales: #Parcourt la liste des orbitales l = orb[-1] #Identifie le type de sous-couche: s, p, d, f n = min(max_elec[l], reste) #Compte le nombre d'électrons dans la sous-couche config.append([f"{orb}",n]) #Sauvegarge dans la liste config de l'orbitale te de son remplissage reste -= n #Retire le nombre d'électrons ajoutés à la sous-couche if reste <= 0: #Fin du parcourt des orbitales quand il n'y a plus d'électrons à répartir break print('Configuration électronique :',config) #Affiche les résultats de configuration return config #Renvoie les résultats de configuration sous forme de liste ## Trace le modèle de Borh d'un atome, avec son nom et son symbole, à but illustratif def traceur1(Z,name,symbol) : orbits = Config(Z) #Fait appel à la fonction Config() et stocke le résultat dans la variable orbits population = [0 for i in range(7)] #Crée une liste de 0 (Longueur de 7) (les couches de 1 à 7) for orb in orbits : #Parcourt la liste orbits n = int(orb[0][0]) #Lit la couche orbitale "1" dans la notation "1s" par exemple population[n-1]+=orb[1] #Ajoute le nombre d'électrons dans la coche correspondante print('Population :',population) #Affiche la répartition de population par couche fig, ax = plt.subplots() #Création du graphique rayons=np.linspace(1,7,7,dtype=int) #Création d'une liste de 7 valeurs (pour les rayons des cercles) for r, n_e in zip(rayons, population): #Parcourt les couches de 1 à 7 et la liste des rayons en même temps if n_e!=0 : #Ne trace le cercle que si le nombre d'électrons est supérireur à 0 cercle = plt.Circle((0, 0), r, fill=False) #Créé un cercle de rayon r et de centre 0,0 ax.add_patch(cercle) #Ajoute le cercle sur le graphe angles = np.linspace(0, 2*np.pi, n_e, endpoint=False) #Calcule les angles pour répartir les n électrons de la couche sur le cercle x = r * np.cos(angles) #Ces deux lignes placent les électrons sur les cercles y = r * np.sin(angles) ax.scatter(x, y, s=50) # s=taille du point nucleus = plt.Circle((0, 0), 0.2, color=(0,0,1)) #Crée le noyau ax.add_patch(nucleus) #Ajoute le noyau ax.set_aspect('equal', 'box') #Fait une boite carrée pour l'affichage du graphique ax.set_xlim(-max(rayons)-1, max(rayons)+1) #Fixe les limites de l'axe x ax.set_ylim(-max(rayons)-1, max(rayons)+1) #Fixe les limites de l'axe y ax.set_xticks([]) #Enlève les graduations de l'axe x ax.set_yticks([]) #Enlève les graduations de l'axe x plt.title(f"Modèle de Bohr - {name} ({symbol})") #Titre plt.show(block=False) #Affiche le graphique dans une nouvelle fenêtre et ne bloque pas la suite de l'execution su programme ## Trace le modèle de Borh d'un atome, et l'enregistre en png dans le dossier actif def traceur2(Z,name) : orbits = Config(Z) population = [0 for i in range(7)] for orb in orbits : n = int(orb[0][0]) population[n-1]+=orb[1] fig, ax = plt.subplots() rayons=np.linspace(1,7,7,dtype=int) for r, n_e in zip(rayons, population): if n_e!=0 : cercle = plt.Circle((0, 0), r, fill=False) ax.add_patch(cercle) angles = np.linspace(0, 2*np.pi, n_e, endpoint=False) x = r * np.cos(angles) y = r * np.sin(angles) ax.scatter(x, y, s=50) # s=taille du point nucleus = plt.Circle((0, 0), 0.2, color=(0,0,1)) ax.add_patch(nucleus) ax.set_aspect('equal', 'box') plt.axis('off') #Enlève les axes ax.set_xlim(-max(rayons)-1, max(rayons)+1) ax.set_ylim(-max(rayons)-1, max(rayons)+1) ax.set_xticks([]) ax.set_yticks([]) plt.savefig(f'orb_{name}') #Sauvegarde la figure sous le nom 'orb_[nom de l'atome]' plt.close() #Ferme la figure après l'enregistrement buttons = {} class PeriodicTableApp: #Création d'un objet def __init__(self, master): #Fonction qui se lance automatiquement lors de la création de l'objet self.master = master #Permet de combiner la fenêtre tkinter à l'objet self.last_clicked = None #Création d'une variable pour stocker le dernier click effectué for (num, sym, name, col, row) in elements: #Parcourt la liste des éléments btn = tk.Button(master, text=sym, width=5, height=2, font=("Georgia", 11, "bold"), command=lambda s=sym: self.on_click(s)) #Paramètres d'affichage du bouton btn.grid(row=row, column=col) #Grille des boutons avec les coordonnées buttons[sym] = btn # sym_clicked = sys.argv[1] if len(sys.argv) > 1 else None def on_click(self, symbol): #Fonction qui s'active lors d'un click sur un bouton buttons[symbol].config(bg="red") name='' #Crée une variable string vide self.last_clicked = symbol #Stocke le symbole dans la variable print("Clic sur :", symbol) #Affiche dans le terminal l'élément clické (symbol) for i in range(len(elements)) : #Parcourt la liste d'éléments if symbol in elements[i] and len(symbol)==len(elements[i][1]) : #Cherche le symbole clické dans la liste name = elements[i][2][1] #Récupère le nom print(name) #Affiche le nom os.makedirs(f"{symbol}_box", exist_ok=True) #Créé un dossier dans le dossier actif en fonction du symbole #Les lignes suivantes servent à copier un template .svg dans le dossier récement crée. Il convient de modifier les chemins comme necessaire. # os.chdir(f"C:/Users/uilisateur/Desktop/SC_HM/prog/{symbol}_box") #Change le dossier actif à celui designé (celui de l'élément) os.chdir(f"D:/fbalba/prog/{symbol}_box") # src=f"C:/Users/uilisateur/Desktop/SC_HM/prog/BasedBox15mm.svg" #Création de stings avec des emplacements de fichiers src=f"D:/fbalba/prog/BasedBox15mm.svg" # dst=f"C:/Users/uilisateur/Desktop/SC_HM/prog/{symbol}_box/{symbol}_box.svg" dst=f"D:/fbalba/prog/{symbol}_box/{symbol}_box.svg" shutil.copy(src,dst) #Commande pour copier le fichier choisi dans le nouvel emplacement for i in range(len(elements)): #Parcourt la liste des éléments if symbol in elements[i] and len(symbol)==len(elements[i][1]) : #Cherche le symbole clické dans la liste traceur1(elements[i][0],elements[i][2][1],elements[i][1]) #Execute les fonctions traceur avec les bons arguments traceur2(elements[i][0],elements[i][2][1]) tree = ET.parse(f"{symbol}_box.svg") #Charge un fichier .svg et permet de travailler avec en python root = tree.getroot() #Necessaire pour modifier le fichier ns = {"svg": "http://www.w3.org/2000/svg"} #ns=Namespace : Dictionnaire qui contient des spcéciations concernant les .svg ET.register_namespace("", ns["svg"]) #Permet au code d'utiliser le namespace for i in range(len(elements)): if symbol in elements[i] and len(symbol)==len(elements[i][1]) : if len(elements[i][1])==1 : #Change la taille de police selon la longueur du symbole symb = ET.Element("{http://www.w3.org/2000/svg}text", { #Mise en forme du texte voulu, ici le symbole "x": "25.1", # X position "y": "33", # Y position "font-size": "17", "font-family": "Elephant", "fill": "black", "text-anchor": "middle" }) symb.text = f"{elements[i][1]}" root.append(symb) else : symb = ET.Element("{http://www.w3.org/2000/svg}text", { "x": "25.1", # X position "y": "33", # Y position "font-size": "14", "font-family": "Elephant", "fill": "black", "text-anchor": "middle" }) symb.text = f"{elements[i][1]}" root.append(symb) for j in range(len(elements[i][2])): #Ajoute les noms dans les différentes langues ypos=54+4*j text = ET.Element("{http://www.w3.org/2000/svg}text", { "x": "56.74", # X position "y": str(ypos), # Y position "font-size": "4", "font-family": "Elephant", "font-weight": "bold", "fill": "black", "text-anchor": "middle" }) text.text = f"{elements[i][2][j]}" root.append(text) eng=ET.Element("{http://www.w3.org/2000/svg}text", { #Ajoute le numéro atomique "x": "25.1", "y": "38", "font-size": "4.5", "font-family": "Elephant", "fill": "black", "text-anchor": "middle" }) eng.text = f"{elements[i][2][0]}" root.append(eng) num=ET.Element("{http://www.w3.org/2000/svg}text", { #Ajoute le numéro atomique "x": "25.1", "y": "103", "font-size": "17", "font-family": "Elephant", "fill": "black", "text-anchor": "middle" }) num.text = f"{elements[i][0]}" root.append(num) number=ET.Element("{http://www.w3.org/2000/svg}text", { #Ajoute le mot "Number" "x": "25.1", "y": "87", "font-size": "6", "font-family": "Elephant", "fill": "black", "text-anchor": "middle" }) number.text = "Number" root.append(number) with open(f"orb_{name}.png", "rb") as f: #Ajoute le modèle de Bohr enregistré dans le dossier actif orb_data = f.read() encoded_orb = base64.b64encode(orb_data).decode("utf-8") orb = ET.Element("{http://www.w3.org/2000/svg}image", { "x": "80", "y": "80", "width": "200", "height": "200", "href": f"data:image/png;base64,{encoded_orb}" }) root.append(orb) watermark=ET.Element("{http://www.w3.org/2000/svg}text", { #Ajoute le texte "Fait avec Python" "x": "130", "y": "125", "font-size": "10", "font-family": "Elephant", "fill": "black", "text-anchor": "middle" }) watermark.text = "Fait avec Python" root.append(watermark) tree.write(f"{symbol}_box.svg", encoding="utf-8", xml_declaration=True) # os.chdir(f"C:/Users/uilisateur/Desktop/SC_HM/prog") #Remet le dossier parent comme actif os.chdir(f"D:/fbalba/prog") # os.startfile(f"C:/Users/uilisateur/Desktop/SC_HM/prog/{symbol}_box/{symbol}_box.svg") #Ouvre le fichier .svg qui vient d'être modifié os.startfile(f"D:/fbalba/prog/{symbol}_box/{symbol}_box.svg") JSON_PATH = None while JSON_PATH is None: JSON_PATH = get_last_json() time.sleep(0.1) with open(JSON_PATH, "r", encoding="utf-8") as f: data = json.load(f) #lit le fichier .json root = tk.Tk() #Permet de créer la fenêtre root.configure(bg="white") root.title("Tableau Périodique") #Nom de la fenêtre app = PeriodicTableApp(root) #Permet à l'objet PeriodicTableApp de s'afficher dans la fenêtre sym_clicked = data.get("symbol", None).strip() print(sym_clicked) #print(buttons) if sym_clicked in buttons: root.after(1000, lambda: buttons[sym_clicked].invoke()) #simule un clic sur le bouton correspondant root.mainloop() #Fait fonctionner la fenêtre jusqu'à sa fermeture print("Valeur finale :", app.last_clicked) #Affiche la denière case clickée lors de la fermeture