I'd use an object orientated approach and this gives me more flexibility if I want to adjust my code and makes it easier to read and understand what happens. Forgive me for the use of another language in my code, its for personal purpose and I have some trouble with English.
I made the database in 3 lists (symbols/keywords,values) and a dictionary (kategorie_farbe) which can easily moved out in a different file. The list stores all the data that I found on Wikipedia:
symbols = ['H','He','Li','Be','B','C','N','O','F','Ne', 'Na','Mg','Al','Si','P','S','Cl','Ar','K', 'Ca', 'Sc', 'Ti', 'V','Cr', 'Mn', 'Fe', 'Co', 'Ni', 'Cu', 'Zn', 'Ga', 'Ge', 'As', 'Se', 'Br', 'Kr', 'Rb', 'Sr', 'Y', 'Zr', 'Nb', 'Mo', 'Tc', 'Ru', 'Rh', 'Pd', 'Ag', 'Cd', 'In', 'Sn', 'Sb', 'Te', 'I', 'Xe','Cs', 'Ba','La', 'Ce', 'Pr', 'Nd', 'Pm', 'Sm', 'Eu', 'Gd', 'Tb', 'Dy', 'Ho', 'Er', 'Tm', 'Yb', 'Lu', 'Hf', 'Ta', 'W', 'Re', 'Os', 'Ir', 'Pt', 'Au', 'Hg', 'Tl', 'Pb', 'Bi', 'Po', 'At', 'Rn', 'Fr', 'Ra', 'Ac', 'Th', 'Pa', 'U', 'Np', 'Pu', 'Am', 'Cm', 'Bk', 'Cf', 'Es', 'Fm', 'Md', 'No', 'Lr', 'Rf', 'Db', 'Sg', 'Bh','Hs', 'Mt', 'Ds', 'Rg', 'Cn', 'Nh', 'Fl', 'Mc', 'Lv', 'Ts', 'Og'] keywords =['name','index','elementkategorie','gruppe','periode','block', 'atommasse','aggregatzustand','dichte','elektronegativität'] values = [['Wasserstoff',1,'Nichtmetalle',1,1,'s',1.01,'gasförmig',0.08,2.2],#H ['Helium',2,'Edelgase',18,1,'s',4.00,'gasförmig',0.18,'n.A'],#He ['Lithium',3,'Alkalimetalle',1,2,'s',6.94,'fest',0.53,0.98],#Li ['Beryllium',4,'Erdalkalimetalle',2,2,'s',9.01,'fest',1.84,1.57],#Be ['Bor',5,'Halbmetalle',13,2,'p',10.81,'fest',2.46,2.04],#B ['Kohlenstoff',6,'Nichtmetalle',14,2,'p',12.01,'fest',2.26,2.55],#C ['Stickstoff',7,'Nichtmetalle',15,2,'p',14.00,'gasförmig',1.17,3.04],#N ['Sauerstoff',8,'Nichtmetalle',16,2,'p',15.99,'gasförmig',1.43,3.44],#O ['Fluor',9,'Halogene',17,2,'p',18.99,'gasförmig',1.70,3.98],#F ['Neon',10,'Edelgase',18,2,'p',20.17,'gasförmig',0.90,'n.A'],#Ne ['Natrium',11,'Alkalimetalle',1,3,'s',22.99,'fest',0.97,0.93],#Na ['Magnesium',12,'Erdalkalimetalle',2,3,'s',24.31,'fest',1.74,1.31],#Mg ['Aluminium',13,'Metalle',13,3,'p',26.98,'fest',2.69,1.61],#Al ['Silicium',14,'Halbmetalle',14,3,'p',28.08,'fest',2.34,1.90],#Si ['Phosphor',15,'Nichtmetalle',15,3,'p',30.97,'fest',2.4,2.19],#P ['Schwefel',16,'Nichtmetalle',16,3,'p',32.06,'fest',2.07,2.58],#S ['Chlor',17,'Halogene',17,3,'p',35.45,'gasförmig',3.22,3.16],#Cl ['Argon',18,'Edelgase',18,3,'p',39.95,'gasförmig',1.78,'n.A'],#Ar ['Kalium',19,'Alkalimetalle',1,4,'s',39.09,'fest',0.86,0.82],#K ['Calicium',20,'Erdalkalimetalle',2,4,'s',40.08,'fest',1.55,1.00],#Ca ['Scandium',21,'Übergangsmetalle',3,4,'d',44.96,'fest',2.99,1.36],#Sc ['Titan',22,'Übergangsmetalle',4,4,'d',47.87,'fest',4.5,1.54],#Ti ['Vandium',23,'Übergangsmetalle',5,4,'d',50.94,'fest',6.11,1.63],#V ['Chrom',24,'Übergangsmetalle',6,4,'d',51.99,'fest',7.14,1.66],#Cr ['Mangan',25,'Übergangsmetalle',7,4,'d',54.94,'fest',7.43,1.55],#Mn ['Eisen',26,'Übergangsmetalle',8,4,'d',55.85,'fest',7.87,1.83],#Fe ['Cobalt',27,'Übergangsmetalle',9,4,'d',58.93,'fest',8.90,1.88],#Co ['Nickel',28,'Übergangsmetalle',10,4,'d',58.69,'fest',8.90,1.91],#Ni ['Kupfer',29,'Übergangsmetalle',11,4,'d',63.54,'fest',8.92,1.90],#Cu ['Zink',30,'Übergangsmetalle',12,4,'d',65.38,'fest',7.14,1.65],#Zn ['Gallium',31,'Metalle',13,4,'p',69.72,'fest',5.90,1.81],#Ga ['Germanium',32,'Halbmetalle',14,4,'p',72.63,'fest',5.32,2.01],#Ge ['Arsen',33,'Halbmetalle',15,4,'p',74.92,'fest',5.73,2.18],#As ['Selen',34,'Halbmetalle',16,4,'p',78.97,'fest',4.82,2.55],#Se ['Brom',35,'Halogene',17,4,'p',79.90,'flüssig',3.12,2.96],#Br ['Krypton',36,'Edelgase',18,4,'p',83.80,'gasförmig',3.75,3.00],#Kr ['Rubidium',37,'Alkalimetalle',1,5,'s',85.47,'fest',1.53,0.82],#Rb ['Strontium',38,'Erdalkalimetalle',2,5,'s',87.62,'fest',2.63,0.95],#Sr ['Yttrium',39,'Übergangsmetalle',3,5,'d',88.91,'fest',4.47,1.22],#Y ['Zirconium',40,'Übergangsmetalle',4,5,'d',91.22,'fest',6.50,1.33],#Zr ['Niob',41,'Übergangsmetalle',5,5,'d',92.90,'fest',8.57,1.6],#Nb ['Molybdän',42,'Übergangsmetalle',6,5,'d',95.95,'fest',10.28,2.16],#Mo ['Technetium',43,'Übergangsmetalle',7,5,'d',98.90,'fest',11.5,1.9],#Tc ['Ruthenium',44,'Übergangsmetalle',8,5,'d',101.07,'fest',12.37,2.2],#Ru ['Rhodium',45,'Übergangsmetalle',9,5,'d',102.90,'fest',12.38,2.28],#Rh ['Palladium',46,'Übergangsmetalle',10,5,'d',106.42,'fest',11.99,2.20],#Pd ['Silber',47,'Übergangsmetalle',11,5,'d',107.87,'fest',10.49,1.93],#Ag ['cadmium',48,'Übergangsmetalle',12,5,'d',112.41,'fest',8.65,1.69],#Cd ['Indium',49,'Metalle',13,5,'p',114.82,'fest',7.31,1.78],#In ['Zinn',50,'Metalle',14,5,'p',118.71,'fest',5.77,1.96],#Sn ['Antimon',51,'Halbmetalle',15,5,'p',121.76,'fest',6.70,2.05],#Sb ['Tellur',52,'Halbmetalle',16,5,'p',127.60,'fest',6.24,2.10],#Te ['Iod',53,'Halogene',17,5,'p',126.90,'fest',4.94,2.66],#I ['Xenon',54,'Edelgase',18,5,'p',131.29,'gasförmig',5.90,2.6],#Xe ['Caesium',55,'Alkalimetalle',1,6,'s',132.91,'fest',1.90,0.79],#Cs ['Barium',56,'Erdalkalimetalle',2,6,'s',137.33,'fest',3.62,0.89],#Ba ['Lanthan',57,'Übergangsmetalle',3,6,'d',138.90,'fest',6.17,1.1],#La ['Cer',58,'Lanthanoide','La',6,'f',140.12,'fest',6.77,1.12],#Ce ['Praseodym',59,'Lanthanoide','La',6,'f',140.91,'fest',6.48,1.13],#Pr ['Neodym',60,'Lanthanoide','La',6,'f',144.24,'fest',7.00,1.14],#Nd ['Promethium',61,'Lanthanoide','La',6,'f',146.91,'fest',7.2,'n.A.'],#Pm ['Samarium',62,'Lanthanoide','La',6,'f',150.36,'fest',7.54,1.17],#Sm ['Europium',63,'Lanthanoide','La',6,'f',151.96,'fest',5.25,'n.A'],#Eu ['Gadolinium',64,'Lanthanoide','La',6,'f',157.25,'fest',7.89,1.20],#Gd ['Terbium',65,'Lanthanoide','La',6,'f',158.93,'fest',8.25,'n.A'],#Tb ['Dysprosium',66,'Lanthanoide','La',6,'f',162.50,'fest',8.56,1.22],#Dy ['Holmium',67,'Lanthanoide','La',6,'f',164.93,'fest',8.78,1.23],#Ho ['Erbium',68,'Lanthanoide','La',6,'f',167.26,'fest',9.05,1.24],#Er ['Thulium',69,'Lanthanoide','La',6,'f',168.93,'fest',9.32,1.25],#Tm ['Ytterbium',70,'Lanthanoide','La',6,'f',173.05,'fest',6.97,'n.A'],#Yb ['Lutetium',71,'Lanthanoide','La',6,'f',174.97,'fest',9.84,1.27],#Lu ['Hafnium',72,'Übergangsmetalle',4,6,'d',178.49,'fest',13.28,1.3],#Hf ['Tantal',73,'Übergangsmetalle',5,6,'d',180.95,'fest',16.65,1.5],#Ta ['Wolfram',74,'Übergangsmetalle',6,6,'d',183.84,'fest',19.25,2.36],#W ['Rhenium',75,'Übergangsmetalle',7,6,'d',186.21,'fest',21.00,1.9],#Re ['Osmium',76,'Übergangsmetalle',8,6,'d',190.23,'fest',22.59,2.2],#Os ['Irdium',77,'Übergangsmetalle',9,6,'d',192.22,'fest',22.56,2.2],#Ir ['Platin',78,'Übergangsmetalle',10,6,'d',195.08,'fest',21.45,2.2],#Pt ['Gold',79,'Übergangsmetalle',11,6,'d',196.97,'fest',19.32,2.54],#Au ['Quecksilber',80,'Übergangsmetalle',12,6,'d',200.59,'flüssig',13.55,2.00],#Hg ['Thalium',81,'Metalle',13,6,'p',204.38,'fest',11.85,1.62],#Tl ['Blei',82,'Metalle',14,6,'p',207.20,'fest',11.34,2.33],#Pb ['Bismut',83,'Metalle',15,6,'p',208.98,'fest',9.78,2.02],#Bi ['Polonium',84,'Metalle',16,6,'p',209.98,'fest',9.20,2.0],#Po ['Astat',85,'Halogene',17,6,'p',209.99,'fest','n.A',2.2],#At ['Radon',86,'Edelgase',18,6,'p',222.00,'gasförmig',9.73,'n.A'],#Rn ['Francium',87,'Alkalimetalle',1,7,'s',223.02,'fest','n.A',0.7],#Fr ['Radium',88,'Erdalkalimetalle',2,7,'s',226.03,'fest',5.5,0.9],#Ra ['Actinium',89,'Übergangsmetalle',3,7,'d',227.03,'fest',10.07,1.1],#Ac ['Thorium',90,'Actinoide','Ac',7,'f',232.04,'fest',11.72,1.3],#Th ['Protactinium',91,'Actinoide','Ac',7,'f',231.04,'fest',15.37,1.5],#Pa ['Uran',92,'Actinoide','Ac',7,'f',238.03,'fest',19.16,1.38],#U ['Neptunium',93,'Actinoide','Ac',7,'f',237.05,'fest',20.45,1.36],#Np ['Plutonium',94,'Actinoide','Ac',7,'f',244.06,'fest',19.82,1.28],#Pu ['Americium',95,'Actinoide','Ac',7,'f',243.06,'fest',13.67,1.3],#Am ['Curium',96,'Actinoide','Ac',7,'f',247.07,'fest',13.51,1.3],#Cm ['Berkelium',97,'Actinoide','Ac',7,'f',247,'fest',14.78,1.3],#Bk ['Californium',98,'Actinoide','Ac',7,'f',251,'fest',15.1,1.3],#Cf ['Einsteinium',99,'Actinoide','Ac',7,'f',252,'fest',8.84,'n.A'],#Es ['Fermium',100,'Actinoide','Ac',7,'f',257.10,'fest','n.A','n.A'],#Fm ['Medelevium',101,'Actinoide','Ac',7,'f',258,'fest','n.A','n.A'],#Md ['Nobelium',102,'Actinoide','Ac',7,'f',259,'fest','n.A.','n.A'],#No ['Lawrencium',103,'Actinoide','Ac',7,'f',266,'fest','n.A','n.A'],#Lr ['Rutherdordium',104,'Übergangsmetalle',4,7,'d',261.11,'fest',17.00,'n.A'],#Rf ['Dubnium',105,'Übergangsmetalle',5,7,'d',262.11,'n.A','n.A','n.A'],#Db ['Seaborgium',106,'Übergangsmetalle',6,7,'d',263.12,'n.A','n.A','n.A'],#Sg ['Bohrium',107,'Übergangsmetalle',7,7,'d',262.12,'n.A','n.A','n.A'],#Bh ['Hassium',108,'Übergangsmetalle',8,7,'d',265,'n.A','n.A','n.A'],#Hs ['Meitnerium',109,'Unbekannt',9,7,'d',268,'n.A','n.A','n.A'],#Mt ['Darmstadtium',110,'Unbekannt',10,7,'d',281,'n.A','n.A','n.A'],#Ds ['Roentgenium',111,'Unbekannt',11,7,'d',280,'n.A','n.A','n.A'],#Rg ['Copernicium',112,'Unbekannt',12,7,'d',277,'n.A','n.A','n.A'],#Cn ['Nihonium',113,'Unbekannt',13,7,'p',287,'n.A','n.A','n.A'],#Nh ['Flerovium',114,'Unbekannt',14,7,'p',289,'n.A','n.A','n.A'],#Fl ['Moscovium',115,'Unbekannt',15,7,'p',288,'n.A','n.A','n.A'],#Mc ['Livermorium',116,'Unbekannt',16,7,'p',293,'n.A','n.A','n.A'],#Lv ['Tenness',117,'Unbekannt',17,7,'p',292,'n.A','n.A','n.A'],#Ts ['Oganesson',118,'Unbekannt',18,7,'p',294,'fest',6.6,'n.A']#Og ] kategorie_farben = {'Alkalimetalle' : '#fe6f61', 'Erdalkalimetalle':'#6791a7', 'Übergangsmetalle':'#83b8d0', 'Metalle':'#cae2ed', 'Halbmetalle':'#a7d6bc', 'Nichtmetalle':'#ffde66', 'Halogene':'#e9aa63', 'Edelgase':'#e29136', 'Unbekannt':'#cec0bf', 'Lanthanoide':'#696071', 'Actinoide':'#5b4c68'}
Here I made an object that inherits from tk.Frame and a few labels gridded on it to show the data of my choice:
class Element(tk.Frame): la_offset = 2;ac_offset=2;offset=2 def __init__(self,master,symbol,**kwargs): tk.Frame.__init__(self,master, relief = 'raised') self.kwargs = kwargs self.WIDTH,self.HEIGHT,self.BD = 100,100,3 self.CMP = self.BD*2 bg = kategorie_farben.get(kwargs.get('elementkategorie')) self.configure(width=self.WIDTH,height=self.HEIGHT,bd=self.BD, bg=bg) self.grid_propagate(0) self.idx = tk.Label(self,text=kwargs.get('index'),bg=bg) self.u = tk.Label(self,text=kwargs.get('atommasse'),bg=bg) self.name = tk.Label(self,text=kwargs.get('name'),bg=bg) self.symb = tk.Label(self,text=symbol,font=('bold'),fg=self.get_fg(),bg=bg) self.e = tk.Label(self,text=kwargs.get('elektronegativität'),bg=bg) self.d = tk.Label(self,text=kwargs.get('dichte'),bg=bg) self.grid_columnconfigure(1, weight=2) self.grid_rowconfigure(1, weight=2) self.idx.grid(row=0,column=0,sticky='w') self.u.grid(row=0,column=2,sticky='e') mid_x = self.WIDTH/2-self.name.winfo_reqwidth()/2 mid_y = self.HEIGHT/2-self.name.winfo_reqheight()/2 offset= 15 self.name.place(in_=self,x=mid_x-self.CMP,y=mid_y-self.CMP+offset) mid_x = self.WIDTH/2-self.symb.winfo_reqwidth()/2 mid_y = self.HEIGHT/2-self.symb.winfo_reqheight()/2 self.symb.place(in_=self,x=mid_x-self.CMP,y=mid_y-self.CMP-offset/2) self.e.grid(row=2,column=0,sticky='w') self.d.grid(row=2,column=2,sticky='e') r,c = kwargs.pop('periode'),kwargs.pop('gruppe') if c in ('La','Ac'): var = 2 if c is 'La': c =Element.la_offset+var;Element.la_offset +=1 r += self.offset if c is 'Ac': c =Element.ac_offset+var;Element.ac_offset +=1 r += Element.offset self.grid(row=r,column=c,sticky='nswe') def get_fg(self): if self.kwargs.get('aggregatzustand') == 'fest': return 'black' if self.kwargs.get('aggregatzustand') == 'flüssig': return 'blue' if self.kwargs.get('aggregatzustand') == 'gasförmig': return 'red' if self.kwargs.get('aggregatzustand') == 'n.A': return 'grey'
and in the end I made the window and a for loop to run my programm:
import tkinter as tk root = tk.Tk() for idx,symbol in enumerate(symbols): kwargs = {} for k,v in zip(keywords,values[idx]): kwargs.update({k:v}) Element(root,symbol,**kwargs)
The final result looks like this: 
As a clickable version of that table:
class Element(tk.Frame): la_offset = 2;ac_offset=2;offset=2 def __init__(self,master,symbol,**kwargs): tk.Frame.__init__(self,master, relief = 'raised') self.kwargs = kwargs self.command= kwargs.pop('command', lambda:print('No command')) self.WIDTH,self.HEIGHT,self.BD = 100,100,3 self.CMP = self.BD*2 bg = kategorie_farben.get(kwargs.get('elementkategorie')) self.configure(width=self.WIDTH,height=self.HEIGHT,bd=self.BD, bg=bg) self.grid_propagate(0) self.idx = tk.Label(self,text=kwargs.get('index'),bg=bg) self.u = tk.Label(self,text=kwargs.get('atommasse'),bg=bg) self.name = tk.Label(self,text=kwargs.get('name'),bg=bg) self.symb = tk.Label(self,text=symbol,font=('bold'),fg=self.get_fg(),bg=bg) self.e = tk.Label(self,text=kwargs.get('elektronegativität'),bg=bg) self.d = tk.Label(self,text=kwargs.get('dichte'),bg=bg) self.grid_columnconfigure(1, weight=2) self.grid_rowconfigure(1, weight=2) self.idx.grid(row=0,column=0,sticky='w') self.u.grid(row=0,column=2,sticky='e') mid_x = self.WIDTH/2-self.name.winfo_reqwidth()/2 mid_y = self.HEIGHT/2-self.name.winfo_reqheight()/2 offset= 15 self.name.place(in_=self,x=mid_x-self.CMP,y=mid_y-self.CMP+offset) mid_x = self.WIDTH/2-self.symb.winfo_reqwidth()/2 mid_y = self.HEIGHT/2-self.symb.winfo_reqheight()/2 self.symb.place(in_=self,x=mid_x-self.CMP,y=mid_y-self.CMP-offset/2) self.e.grid(row=2,column=0,sticky='w') self.d.grid(row=2,column=2,sticky='e') r,c = kwargs.pop('periode'),kwargs.pop('gruppe') if c in ('La','Ac'): if c == 'La': c =Element.la_offset+Element.offset;Element.la_offset +=1 r += self.offset if c == 'Ac': c =Element.ac_offset+Element.offset;Element.ac_offset +=1 r += Element.offset self.grid(row=r,column=c,sticky='nswe') self.bind('<Enter>', self.in_active) self.bind('<Leave>', self.in_active) self.bind('<ButtonPress-1>', self.indicate) self.bind('<ButtonRelease-1>', self.execute) [child.bind('<ButtonPress-1>', self.indicate) for child in self.winfo_children()] [child.bind('<ButtonRelease-1>', self.execute) for child in self.winfo_children()] def in_active(self,event): if str(event.type) == 'Enter': self.flag = True if str(event.type) == 'Leave': self.flag = False;self.configure(relief='raised') def indicate(self,event): self.configure(relief='sunken') def execute(self,event): if self.flag: self.command();self.configure(relief='raised') else: self.configure(relief='raised') def get_fg(self): if self.kwargs.get('aggregatzustand') == 'fest': return 'black' if self.kwargs.get('aggregatzustand') == 'flüssig': return 'blue' if self.kwargs.get('aggregatzustand') == 'gasförmig': return 'red' if self.kwargs.get('aggregatzustand') == 'n.A': return 'grey' def test(): print('testing..') for idx,symbol in enumerate(symbols): kwargs = {} for k,v in zip(keywords,values[idx]): kwargs.update({k:v}) Element(root,symbol,command=test,**kwargs)