Don't leave **kwargs as a dictionary; instead make a simple @dataclass or named tuple.
Factor out your creation of a middle-placed label for name and symbol to a function. Better yet: don't call place, and just represent your name and symbol labels as rows within the grid that span the width of the grid and are sticky to both east and west.
You should name all of your widgets. If you don't, a name will be generated for you internally and this will make debugging more difficult.
Your element grid coordinate calculations are non-reentrant and can be performed only once per process run, since your offset variables are stored as statics. You should refactor this; the nicest way is an iterator function that keeps these offsets as locals and throws them away once all elements have been placed.
Rather than binding your mouse events to all children of your element frame, consider just calling a bindtags to pass all events from the child labels to the parent frame.
Typo: it's "rutherfordium".
[
{
"symbol": "H",
"name": "Wasserstoff",
"number": 1,
"category": "Nichtmetalle",
"group": 1,
"period": 1,
"block": "s",
"mass": 1.01,
"phase": "gasförmig",
"density": 0.08,
"electronegativity": 2.2
},
{
"symbol": "He",
"name": "Helium",
"number": 2,
"category": "Edelgase",
"group": 18,
"period": 1,
"block": "s",
"mass": 4.0,
"phase": "gasförmig",
"density": 0.18,
"electronegativity": null
},
{
"symbol": "Li",
"name": "Lithium",
"number": 3,
"category": "Alkalimetalle",
"group": 1,
"period": 2,
"block": "s",
"mass": 6.94,
"phase": "fest",
"density": 0.53,
"electronegativity": 0.98
},
{
"symbol": "Be",
"name": "Beryllium",
"number": 4,
"category": "Erdalkalimetalle",
"group": 2,
"period": 2,
"block": "s",
"mass": 9.01,
"phase": "fest",
"density": 1.84,
"electronegativity": 1.57
},
{
"symbol": "B",
"name": "Bor",
"number": 5,
"category": "Halbmetalle",
"group": 13,
"period": 2,
"block": "p",
"mass": 10.81,
"phase": "fest",
"density": 2.46,
"electronegativity": 2.04
},
{
"symbol": "C",
"name": "Kohlenstoff",
"number": 6,
"category": "Nichtmetalle",
"group": 14,
"period": 2,
"block": "p",
"mass": 12.01,
"phase": "fest",
"density": 2.26,
"electronegativity": 2.55
},
{
"symbol": "N",
"name": "Stickstoff",
"number": 7,
"category": "Nichtmetalle",
"group": 15,
"period": 2,
"block": "p",
"mass": 14.0,
"phase": "gasförmig",
"density": 1.17,
"electronegativity": 3.04
},
{
"symbol": "O",
"name": "Sauerstoff",
"number": 8,
"category": "Nichtmetalle",
"group": 16,
"period": 2,
"block": "p",
"mass": 15.99,
"phase": "gasförmig",
"density": 1.43,
"electronegativity": 3.44
},
{
"symbol": "F",
"name": "Fluor",
"number": 9,
"category": "Halogene",
"group": 17,
"period": 2,
"block": "p",
"mass": 18.99,
"phase": "gasförmig",
"density": 1.7,
"electronegativity": 3.98
},
{
"symbol": "Ne",
"name": "Neon",
"number": 10,
"category": "Edelgase",
"group": 18,
"period": 2,
"block": "p",
"mass": 20.17,
"phase": "gasförmig",
"density": 0.9,
"electronegativity": null
},
{
"symbol": "Na",
"name": "Natrium",
"number": 11,
"category": "Alkalimetalle",
"group": 1,
"period": 3,
"block": "s",
"mass": 22.99,
"phase": "fest",
"density": 0.97,
"electronegativity": 0.93
},
{
"symbol": "Mg",
"name": "Magnesium",
"number": 12,
"category": "Erdalkalimetalle",
"group": 2,
"period": 3,
"block": "s",
"mass": 24.31,
"phase": "fest",
"density": 1.74,
"electronegativity": 1.31
},
{
"symbol": "Al",
"name": "Aluminium",
"number": 13,
"category": "Metalle",
"group": 13,
"period": 3,
"block": "p",
"mass": 26.98,
"phase": "fest",
"density": 2.69,
"electronegativity": 1.61
},
{
"symbol": "Si",
"name": "Silicium",
"number": 14,
"category": "Halbmetalle",
"group": 14,
"period": 3,
"block": "p",
"mass": 28.08,
"phase": "fest",
"density": 2.34,
"electronegativity": 1.9
},
{
"symbol": "P",
"name": "Phosphor",
"number": 15,
"category": "Nichtmetalle",
"group": 15,
"period": 3,
"block": "p",
"mass": 30.97,
"phase": "fest",
"density": 2.4,
"electronegativity": 2.19
},
{
"symbol": "S",
"name": "Schwefel",
"number": 16,
"category": "Nichtmetalle",
"group": 16,
"period": 3,
"block": "p",
"mass": 32.06,
"phase": "fest",
"density": 2.07,
"electronegativity": 2.58
},
{
"symbol": "Cl",
"name": "Chlor",
"number": 17,
"category": "Halogene",
"group": 17,
"period": 3,
"block": "p",
"mass": 35.45,
"phase": "gasförmig",
"density": 3.22,
"electronegativity": 3.16
},
{
"symbol": "Ar",
"name": "Argon",
"number": 18,
"category": "Edelgase",
"group": 18,
"period": 3,
"block": "p",
"mass": 39.95,
"phase": "gasförmig",
"density": 1.78,
"electronegativity": null
},
{
"symbol": "K",
"name": "Kalium",
"number": 19,
"category": "Alkalimetalle",
"group": 1,
"period": 4,
"block": "s",
"mass": 39.09,
"phase": "fest",
"density": 0.86,
"electronegativity": 0.82
},
{
"symbol": "Ca",
"name": "Calicium",
"number": 20,
"category": "Erdalkalimetalle",
"group": 2,
"period": 4,
"block": "s",
"mass": 40.08,
"phase": "fest",
"density": 1.55,
"electronegativity": 1.0
},
{
"symbol": "Sc",
"name": "Scandium",
"number": 21,
"category": "Übergangsmetalle",
"group": 3,
"period": 4,
"block": "d",
"mass": 44.96,
"phase": "fest",
"density": 2.99,
"electronegativity": 1.36
},
{
"symbol": "Ti",
"name": "Titan",
"number": 22,
"category": "Übergangsmetalle",
"group": 4,
"period": 4,
"block": "d",
"mass": 47.87,
"phase": "fest",
"density": 4.5,
"electronegativity": 1.54
},
{
"symbol": "V",
"name": "Vandium",
"number": 23,
"category": "Übergangsmetalle",
"group": 5,
"period": 4,
"block": "d",
"mass": 50.94,
"phase": "fest",
"density": 6.11,
"electronegativity": 1.63
},
{
"symbol": "Cr",
"name": "Chrom",
"number": 24,
"category": "Übergangsmetalle",
"group": 6,
"period": 4,
"block": "d",
"mass": 51.99,
"phase": "fest",
"density": 7.14,
"electronegativity": 1.66
},
{
"symbol": "Mn",
"name": "Mangan",
"number": 25,
"category": "Übergangsmetalle",
"group": 7,
"period": 4,
"block": "d",
"mass": 54.94,
"phase": "fest",
"density": 7.43,
"electronegativity": 1.55
},
{
"symbol": "Fe",
"name": "Eisen",
"number": 26,
"category": "Übergangsmetalle",
"group": 8,
"period": 4,
"block": "d",
"mass": 55.85,
"phase": "fest",
"density": 7.87,
"electronegativity": 1.83
},
{
"symbol": "Co",
"name": "Cobalt",
"number": 27,
"category": "Übergangsmetalle",
"group": 9,
"period": 4,
"block": "d",
"mass": 58.93,
"phase": "fest",
"density": 8.9,
"electronegativity": 1.88
},
{
"symbol": "Ni",
"name": "Nickel",
"number": 28,
"category": "Übergangsmetalle",
"group": 10,
"period": 4,
"block": "d",
"mass": 58.69,
"phase": "fest",
"density": 8.9,
"electronegativity": 1.91
},
{
"symbol": "Cu",
"name": "Kupfer",
"number": 29,
"category": "Übergangsmetalle",
"group": 11,
"period": 4,
"block": "d",
"mass": 63.54,
"phase": "fest",
"density": 8.92,
"electronegativity": 1.9
},
{
"symbol": "Zn",
"name": "Zink",
"number": 30,
"category": "Übergangsmetalle",
"group": 12,
"period": 4,
"block": "d",
"mass": 65.38,
"phase": "fest",
"density": 7.14,
"electronegativity": 1.65
},
{
"symbol": "Ga",
"name": "Gallium",
"number": 31,
"category": "Metalle",
"group": 13,
"period": 4,
"block": "p",
"mass": 69.72,
"phase": "fest",
"density": 5.9,
"electronegativity": 1.81
},
{
"symbol": "Ge",
"name": "Germanium",
"number": 32,
"category": "Halbmetalle",
"group": 14,
"period": 4,
"block": "p",
"mass": 72.63,
"phase": "fest",
"density": 5.32,
"electronegativity": 2.01
},
{
"symbol": "As",
"name": "Arsen",
"number": 33,
"category": "Halbmetalle",
"group": 15,
"period": 4,
"block": "p",
"mass": 74.92,
"phase": "fest",
"density": 5.73,
"electronegativity": 2.18
},
{
"symbol": "Se",
"name": "Selen",
"number": 34,
"category": "Halbmetalle",
"group": 16,
"period": 4,
"block": "p",
"mass": 78.97,
"phase": "fest",
"density": 4.82,
"electronegativity": 2.55
},
{
"symbol": "Br",
"name": "Brom",
"number": 35,
"category": "Halogene",
"group": 17,
"period": 4,
"block": "p",
"mass": 79.9,
"phase": "flüssig",
"density": 3.12,
"electronegativity": 2.96
},
{
"symbol": "Kr",
"name": "Krypton",
"number": 36,
"category": "Edelgase",
"group": 18,
"period": 4,
"block": "p",
"mass": 83.8,
"phase": "gasförmig",
"density": 3.75,
"electronegativity": 3.0
},
{
"symbol": "Rb",
"name": "Rubidium",
"number": 37,
"category": "Alkalimetalle",
"group": 1,
"period": 5,
"block": "s",
"mass": 85.47,
"phase": "fest",
"density": 1.53,
"electronegativity": 0.82
},
{
"symbol": "Sr",
"name": "Strontium",
"number": 38,
"category": "Erdalkalimetalle",
"group": 2,
"period": 5,
"block": "s",
"mass": 87.62,
"phase": "fest",
"density": 2.63,
"electronegativity": 0.95
},
{
"symbol": "Y",
"name": "Yttrium",
"number": 39,
"category": "Übergangsmetalle",
"group": 3,
"period": 5,
"block": "d",
"mass": 88.91,
"phase": "fest",
"density": 4.47,
"electronegativity": 1.22
},
{
"symbol": "Zr",
"name": "Zirconium",
"number": 40,
"category": "Übergangsmetalle",
"group": 4,
"period": 5,
"block": "d",
"mass": 91.22,
"phase": "fest",
"density": 6.5,
"electronegativity": 1.33
},
{
"symbol": "Nb",
"name": "Niob",
"number": 41,
"category": "Übergangsmetalle",
"group": 5,
"period": 5,
"block": "d",
"mass": 92.9,
"phase": "fest",
"density": 8.57,
"electronegativity": 1.6
},
{
"symbol": "Mo",
"name": "Molybdän",
"number": 42,
"category": "Übergangsmetalle",
"group": 6,
"period": 5,
"block": "d",
"mass": 95.95,
"phase": "fest",
"density": 10.28,
"electronegativity": 2.16
},
{
"symbol": "Tc",
"name": "Technetium",
"number": 43,
"category": "Übergangsmetalle",
"group": 7,
"period": 5,
"block": "d",
"mass": 98.9,
"phase": "fest",
"density": 11.5,
"electronegativity": 1.9
},
{
"symbol": "Ru",
"name": "Ruthenium",
"number": 44,
"category": "Übergangsmetalle",
"group": 8,
"period": 5,
"block": "d",
"mass": 101.07,
"phase": "fest",
"density": 12.37,
"electronegativity": 2.2
},
{
"symbol": "Rh",
"name": "Rhodium",
"number": 45,
"category": "Übergangsmetalle",
"group": 9,
"period": 5,
"block": "d",
"mass": 102.9,
"phase": "fest",
"density": 12.38,
"electronegativity": 2.28
},
{
"symbol": "Pd",
"name": "Palladium",
"number": 46,
"category": "Übergangsmetalle",
"group": 10,
"period": 5,
"block": "d",
"mass": 106.42,
"phase": "fest",
"density": 11.99,
"electronegativity": 2.2
},
{
"symbol": "Ag",
"name": "Silber",
"number": 47,
"category": "Übergangsmetalle",
"group": 11,
"period": 5,
"block": "d",
"mass": 107.87,
"phase": "fest",
"density": 10.49,
"electronegativity": 1.93
},
{
"symbol": "Cd",
"name": "cadmium",
"number": 48,
"category": "Übergangsmetalle",
"group": 12,
"period": 5,
"block": "d",
"mass": 112.41,
"phase": "fest",
"density": 8.65,
"electronegativity": 1.69
},
{
"symbol": "In",
"name": "Indium",
"number": 49,
"category": "Metalle",
"group": 13,
"period": 5,
"block": "p",
"mass": 114.82,
"phase": "fest",
"density": 7.31,
"electronegativity": 1.78
},
{
"symbol": "Sn",
"name": "Zinn",
"number": 50,
"category": "Metalle",
"group": 14,
"period": 5,
"block": "p",
"mass": 118.71,
"phase": "fest",
"density": 5.77,
"electronegativity": 1.96
},
{
"symbol": "Sb",
"name": "Antimon",
"number": 51,
"category": "Halbmetalle",
"group": 15,
"period": 5,
"block": "p",
"mass": 121.76,
"phase": "fest",
"density": 6.7,
"electronegativity": 2.05
},
{
"symbol": "Te",
"name": "Tellur",
"number": 52,
"category": "Halbmetalle",
"group": 16,
"period": 5,
"block": "p",
"mass": 127.6,
"phase": "fest",
"density": 6.24,
"electronegativity": 2.1
},
{
"symbol": "I",
"name": "Iod",
"number": 53,
"category": "Halogene",
"group": 17,
"period": 5,
"block": "p",
"mass": 126.9,
"phase": "fest",
"density": 4.94,
"electronegativity": 2.66
},
{
"symbol": "Xe",
"name": "Xenon",
"number": 54,
"category": "Edelgase",
"group": 18,
"period": 5,
"block": "p",
"mass": 131.29,
"phase": "gasförmig",
"density": 5.9,
"electronegativity": 2.6
},
{
"symbol": "Cs",
"name": "Caesium",
"number": 55,
"category": "Alkalimetalle",
"group": 1,
"period": 6,
"block": "s",
"mass": 132.91,
"phase": "fest",
"density": 1.9,
"electronegativity": 0.79
},
{
"symbol": "Ba",
"name": "Barium",
"number": 56,
"category": "Erdalkalimetalle",
"group": 2,
"period": 6,
"block": "s",
"mass": 137.33,
"phase": "fest",
"density": 3.62,
"electronegativity": 0.89
},
{
"symbol": "La",
"name": "Lanthan",
"number": 57,
"category": "Übergangsmetalle",
"group": 3,
"period": 6,
"block": "d",
"mass": 138.9,
"phase": "fest",
"density": 6.17,
"electronegativity": 1.1
},
{
"symbol": "Ce",
"name": "Cer",
"number": 58,
"category": "Lanthanoide",
"group": "La",
"period": 6,
"block": "f",
"mass": 140.12,
"phase": "fest",
"density": 6.77,
"electronegativity": 1.12
},
{
"symbol": "Pr",
"name": "Praseodym",
"number": 59,
"category": "Lanthanoide",
"group": "La",
"period": 6,
"block": "f",
"mass": 140.91,
"phase": "fest",
"density": 6.48,
"electronegativity": 1.13
},
{
"symbol": "Nd",
"name": "Neodym",
"number": 60,
"category": "Lanthanoide",
"group": "La",
"period": 6,
"block": "f",
"mass": 144.24,
"phase": "fest",
"density": 7.0,
"electronegativity": 1.14
},
{
"symbol": "Pm",
"name": "Promethium",
"number": 61,
"category": "Lanthanoide",
"group": "La",
"period": 6,
"block": "f",
"mass": 146.91,
"phase": "fest",
"density": 7.2,
"electronegativity": null
},
{
"symbol": "Sm",
"name": "Samarium",
"number": 62,
"category": "Lanthanoide",
"group": "La",
"period": 6,
"block": "f",
"mass": 150.36,
"phase": "fest",
"density": 7.54,
"electronegativity": 1.17
},
{
"symbol": "Eu",
"name": "Europium",
"number": 63,
"category": "Lanthanoide",
"group": "La",
"period": 6,
"block": "f",
"mass": 151.96,
"phase": "fest",
"density": 5.25,
"electronegativity": null
},
{
"symbol": "Gd",
"name": "Gadolinium",
"number": 64,
"category": "Lanthanoide",
"group": "La",
"period": 6,
"block": "f",
"mass": 157.25,
"phase": "fest",
"density": 7.89,
"electronegativity": 1.2
},
{
"symbol": "Tb",
"name": "Terbium",
"number": 65,
"category": "Lanthanoide",
"group": "La",
"period": 6,
"block": "f",
"mass": 158.93,
"phase": "fest",
"density": 8.25,
"electronegativity": null
},
{
"symbol": "Dy",
"name": "Dysprosium",
"number": 66,
"category": "Lanthanoide",
"group": "La",
"period": 6,
"block": "f",
"mass": 162.5,
"phase": "fest",
"density": 8.56,
"electronegativity": 1.22
},
{
"symbol": "Ho",
"name": "Holmium",
"number": 67,
"category": "Lanthanoide",
"group": "La",
"period": 6,
"block": "f",
"mass": 164.93,
"phase": "fest",
"density": 8.78,
"electronegativity": 1.23
},
{
"symbol": "Er",
"name": "Erbium",
"number": 68,
"category": "Lanthanoide",
"group": "La",
"period": 6,
"block": "f",
"mass": 167.26,
"phase": "fest",
"density": 9.05,
"electronegativity": 1.24
},
{
"symbol": "Tm",
"name": "Thulium",
"number": 69,
"category": "Lanthanoide",
"group": "La",
"period": 6,
"block": "f",
"mass": 168.93,
"phase": "fest",
"density": 9.32,
"electronegativity": 1.25
},
{
"symbol": "Yb",
"name": "Ytterbium",
"number": 70,
"category": "Lanthanoide",
"group": "La",
"period": 6,
"block": "f",
"mass": 173.05,
"phase": "fest",
"density": 6.97,
"electronegativity": null
},
{
"symbol": "Lu",
"name": "Lutetium",
"number": 71,
"category": "Lanthanoide",
"group": "La",
"period": 6,
"block": "f",
"mass": 174.97,
"phase": "fest",
"density": 9.84,
"electronegativity": 1.27
},
{
"symbol": "Hf",
"name": "Hafnium",
"number": 72,
"category": "Übergangsmetalle",
"group": 4,
"period": 6,
"block": "d",
"mass": 178.49,
"phase": "fest",
"density": 13.28,
"electronegativity": 1.3
},
{
"symbol": "Ta",
"name": "Tantal",
"number": 73,
"category": "Übergangsmetalle",
"group": 5,
"period": 6,
"block": "d",
"mass": 180.95,
"phase": "fest",
"density": 16.65,
"electronegativity": 1.5
},
{
"symbol": "W",
"name": "Wolfram",
"number": 74,
"category": "Übergangsmetalle",
"group": 6,
"period": 6,
"block": "d",
"mass": 183.84,
"phase": "fest",
"density": 19.25,
"electronegativity": 2.36
},
{
"symbol": "Re",
"name": "Rhenium",
"number": 75,
"category": "Übergangsmetalle",
"group": 7,
"period": 6,
"block": "d",
"mass": 186.21,
"phase": "fest",
"density": 21.0,
"electronegativity": 1.9
},
{
"symbol": "Os",
"name": "Osmium",
"number": 76,
"category": "Übergangsmetalle",
"group": 8,
"period": 6,
"block": "d",
"mass": 190.23,
"phase": "fest",
"density": 22.59,
"electronegativity": 2.2
},
{
"symbol": "Ir",
"name": "Irdium",
"number": 77,
"category": "Übergangsmetalle",
"group": 9,
"period": 6,
"block": "d",
"mass": 192.22,
"phase": "fest",
"density": 22.56,
"electronegativity": 2.2
},
{
"symbol": "Pt",
"name": "Platin",
"number": 78,
"category": "Übergangsmetalle",
"group": 10,
"period": 6,
"block": "d",
"mass": 195.08,
"phase": "fest",
"density": 21.45,
"electronegativity": 2.2
},
{
"symbol": "Au",
"name": "Gold",
"number": 79,
"category": "Übergangsmetalle",
"group": 11,
"period": 6,
"block": "d",
"mass": 196.97,
"phase": "fest",
"density": 19.32,
"electronegativity": 2.54
},
{
"symbol": "Hg",
"name": "Quecksilber",
"number": 80,
"category": "Übergangsmetalle",
"group": 12,
"period": 6,
"block": "d",
"mass": 200.59,
"phase": "flüssig",
"density": 13.55,
"electronegativity": 2.0
},
{
"symbol": "Tl",
"name": "Thalium",
"number": 81,
"category": "Metalle",
"group": 13,
"period": 6,
"block": "p",
"mass": 204.38,
"phase": "fest",
"density": 11.85,
"electronegativity": 1.62
},
{
"symbol": "Pb",
"name": "Blei",
"number": 82,
"category": "Metalle",
"group": 14,
"period": 6,
"block": "p",
"mass": 207.2,
"phase": "fest",
"density": 11.34,
"electronegativity": 2.33
},
{
"symbol": "Bi",
"name": "Bismut",
"number": 83,
"category": "Metalle",
"group": 15,
"period": 6,
"block": "p",
"mass": 208.98,
"phase": "fest",
"density": 9.78,
"electronegativity": 2.02
},
{
"symbol": "Po",
"name": "Polonium",
"number": 84,
"category": "Metalle",
"group": 16,
"period": 6,
"block": "p",
"mass": 209.98,
"phase": "fest",
"density": 9.2,
"electronegativity": 2.0
},
{
"symbol": "At",
"name": "Astat",
"number": 85,
"category": "Halogene",
"group": 17,
"period": 6,
"block": "p",
"mass": 209.99,
"phase": "fest",
"density": null,
"electronegativity": 2.2
},
{
"symbol": "Rn",
"name": "Radon",
"number": 86,
"category": "Edelgase",
"group": 18,
"period": 6,
"block": "p",
"mass": 222.0,
"phase": "gasförmig",
"density": 9.73,
"electronegativity": null
},
{
"symbol": "Fr",
"name": "Francium",
"number": 87,
"category": "Alkalimetalle",
"group": 1,
"period": 7,
"block": "s",
"mass": 223.02,
"phase": "fest",
"density": null,
"electronegativity": 0.7
},
{
"symbol": "Ra",
"name": "Radium",
"number": 88,
"category": "Erdalkalimetalle",
"group": 2,
"period": 7,
"block": "s",
"mass": 226.03,
"phase": "fest",
"density": 5.5,
"electronegativity": 0.9
},
{
"symbol": "Ac",
"name": "Actinium",
"number": 89,
"category": "Übergangsmetalle",
"group": 3,
"period": 7,
"block": "d",
"mass": 227.03,
"phase": "fest",
"density": 10.07,
"electronegativity": 1.1
},
{
"symbol": "Th",
"name": "Thorium",
"number": 90,
"category": "Actinoide",
"group": "Ac",
"period": 7,
"block": "f",
"mass": 232.04,
"phase": "fest",
"density": 11.72,
"electronegativity": 1.3
},
{
"symbol": "Pa",
"name": "Protactinium",
"number": 91,
"category": "Actinoide",
"group": "Ac",
"period": 7,
"block": "f",
"mass": 231.04,
"phase": "fest",
"density": 15.37,
"electronegativity": 1.5
},
{
"symbol": "U",
"name": "Uran",
"number": 92,
"category": "Actinoide",
"group": "Ac",
"period": 7,
"block": "f",
"mass": 238.03,
"phase": "fest",
"density": 19.16,
"electronegativity": 1.38
},
{
"symbol": "Np",
"name": "Neptunium",
"number": 93,
"category": "Actinoide",
"group": "Ac",
"period": 7,
"block": "f",
"mass": 237.05,
"phase": "fest",
"density": 20.45,
"electronegativity": 1.36
},
{
"symbol": "Pu",
"name": "Plutonium",
"number": 94,
"category": "Actinoide",
"group": "Ac",
"period": 7,
"block": "f",
"mass": 244.06,
"phase": "fest",
"density": 19.82,
"electronegativity": 1.28
},
{
"symbol": "Am",
"name": "Americium",
"number": 95,
"category": "Actinoide",
"group": "Ac",
"period": 7,
"block": "f",
"mass": 243.06,
"phase": "fest",
"density": 13.67,
"electronegativity": 1.3
},
{
"symbol": "Cm",
"name": "Curium",
"number": 96,
"category": "Actinoide",
"group": "Ac",
"period": 7,
"block": "f",
"mass": 247.07,
"phase": "fest",
"density": 13.51,
"electronegativity": 1.3
},
{
"symbol": "Bk",
"name": "Berkelium",
"number": 97,
"category": "Actinoide",
"group": "Ac",
"period": 7,
"block": "f",
"mass": 247,
"phase": "fest",
"density": 14.78,
"electronegativity": 1.3
},
{
"symbol": "Cf",
"name": "Californium",
"number": 98,
"category": "Actinoide",
"group": "Ac",
"period": 7,
"block": "f",
"mass": 251,
"phase": "fest",
"density": 15.1,
"electronegativity": 1.3
},
{
"symbol": "Es",
"name": "Einsteinium",
"number": 99,
"category": "Actinoide",
"group": "Ac",
"period": 7,
"block": "f",
"mass": 252,
"phase": "fest",
"density": 8.84,
"electronegativity": null
},
{
"symbol": "Fm",
"name": "Fermium",
"number": 100,
"category": "Actinoide",
"group": "Ac",
"period": 7,
"block": "f",
"mass": 257.1,
"phase": "fest",
"density": null,
"electronegativity": null
},
{
"symbol": "Md",
"name": "Medelevium",
"number": 101,
"category": "Actinoide",
"group": "Ac",
"period": 7,
"block": "f",
"mass": 258,
"phase": "fest",
"density": null,
"electronegativity": null
},
{
"symbol": "No",
"name": "Nobelium",
"number": 102,
"category": "Actinoide",
"group": "Ac",
"period": 7,
"block": "f",
"mass": 259,
"phase": "fest",
"density": null,
"electronegativity": null
},
{
"symbol": "Lr",
"name": "Lawrencium",
"number": 103,
"category": "Actinoide",
"group": "Ac",
"period": 7,
"block": "f",
"mass": 266,
"phase": "fest",
"density": null,
"electronegativity": null
},
{
"symbol": "Rf",
"name": "Rutherdordium""Rutherfordium",
"number": 104,
"category": "Übergangsmetalle",
"group": 4,
"period": 7,
"block": "d",
"mass": 261.11,
"phase": "fest",
"density": 17.0,
"electronegativity": null
},
{
"symbol": "Db",
"name": "Dubnium",
"number": 105,
"category": "Übergangsmetalle",
"group": 5,
"period": 7,
"block": "d",
"mass": 262.11,
"phase": null,
"density": null,
"electronegativity": null
},
{
"symbol": "Sg",
"name": "Seaborgium",
"number": 106,
"category": "Übergangsmetalle",
"group": 6,
"period": 7,
"block": "d",
"mass": 263.12,
"phase": null,
"density": null,
"electronegativity": null
},
{
"symbol": "Bh",
"name": "Bohrium",
"number": 107,
"category": "Übergangsmetalle",
"group": 7,
"period": 7,
"block": "d",
"mass": 262.12,
"phase": null,
"density": null,
"electronegativity": null
},
{
"symbol": "Hs",
"name": "Hassium",
"number": 108,
"category": "Übergangsmetalle",
"group": 8,
"period": 7,
"block": "d",
"mass": 265,
"phase": null,
"density": null,
"electronegativity": null
},
{
"symbol": "Mt",
"name": "Meitnerium",
"number": 109,
"category": "Unbekannt",
"group": 9,
"period": 7,
"block": "d",
"mass": 268,
"phase": null,
"density": null,
"electronegativity": null
},
{
"symbol": "Ds",
"name": "Darmstadtium",
"number": 110,
"category": "Unbekannt",
"group": 10,
"period": 7,
"block": "d",
"mass": 281,
"phase": null,
"density": null,
"electronegativity": null
},
{
"symbol": "Rg",
"name": "Roentgenium",
"number": 111,
"category": "Unbekannt",
"group": 11,
"period": 7,
"block": "d",
"mass": 280,
"phase": null,
"density": null,
"electronegativity": null
},
{
"symbol": "Cn",
"name": "Copernicium",
"number": 112,
"category": "Unbekannt",
"group": 12,
"period": 7,
"block": "d",
"mass": 277,
"phase": null,
"density": null,
"electronegativity": null
},
{
"symbol": "Nh",
"name": "Nihonium",
"number": 113,
"category": "Unbekannt",
"group": 13,
"period": 7,
"block": "p",
"mass": 287,
"phase": null,
"density": null,
"electronegativity": null
},
{
"symbol": "Fl",
"name": "Flerovium",
"number": 114,
"category": "Unbekannt",
"group": 14,
"period": 7,
"block": "p",
"mass": 289,
"phase": null,
"density": null,
"electronegativity": null
},
{
"symbol": "Mc",
"name": "Moscovium",
"number": 115,
"category": "Unbekannt",
"group": 15,
"period": 7,
"block": "p",
"mass": 288,
"phase": null,
"density": null,
"electronegativity": null
},
{
"symbol": "Lv",
"name": "Livermorium",
"number": 116,
"category": "Unbekannt",
"group": 16,
"period": 7,
"block": "p",
"mass": 293,
"phase": null,
"density": null,
"electronegativity": null
},
{
"symbol": "Ts",
"name": "Tenness",
"number": 117,
"category": "Unbekannt",
"group": 17,
"period": 7,
"block": "p",
"mass": 292,
"phase": null,
"density": null,
"electronegativity": null
},
{
"symbol": "Og",
"name": "Oganesson",
"number": 118,
"category": "Unbekannt",
"group": 18,
"period": 7,
"block": "p",
"mass": 294,
"phase": "fest",
"density": 6.6,
"electronegativity": null
}
]
import json
import tkinter as tk
import webbrowser
from dataclasses import dataclass
from locale import setlocale, LC_ALL, format_string
from typing import Optional, Union, Iterable, Iterator, NamedTuple
@dataclass
class Element(NamedTuple):
symbol: str
name: str
number: int
category: str
group: Union[str, int]
period: int
block: str
mass: float
phase: Optional[str]
density: Optional[float]
electronegativity: Optional[float]
class PlacedElement(NamedTuple):
row: int
column: int
element: Element
def format_float(s: Optional[float]) -> str:
if s is None:
return 'n.A'
return format_string('%.2f', s)
classdef ElementButtonplace_elements(elements: Iterable[Element]) -> Iterator[PlacedElement]:
OFFSET = 2
la_offset = 2
ac_offset = 2
for element in elements:
period, group_name = element.period, element.group
if group_name == 'La':
group = la_offset + OFFSET
la_offset += 1
period += OFFSET
elif group_name == 'Ac':
group = 2ac_offset + OFFSET
ac_offset += 1
period += OFFSET
else:
group = group_name
yield PlacedElement(row=period - 1, column=group - 1, element=element)
def load_json(filename: str = 'elements.json') -> Iterator[Element]:
with open(filename, encoding='utf-8') as f:
for element_dict in json.load(f):
yield Element(**element_dict)
class ElementButton:
BORDER = 3
CATEGORY_COLORS = {
'Alkalimetalle': '#fe6f61',
'Erdalkalimetalle': '#6791a7',
'Übergangsmetalle': '#83b8d0',
'Metalle': '#cae2ed',
'Halbmetalle': '#a7d6bc',
'Nichtmetalle': '#ffde66',
'Halogene': '#e9aa63',
'Edelgase': '#e29136',
'Unbekannt': '#cec0bf',
'Lanthanoide': '#696071',
'Actinoide': '#5b4c68',
}
PHASE_COLORS = {
'fest': 'black',
'flüssig': 'blue',
'gasförmig': 'red',
None: 'grey',
}
def __init__(self, parent: tk.Widget, elementplaced_element: ElementPlacedElement) -> None:
self.element = placed_element.element
self.background = self.CATEGORY_COLORS[elementCATEGORY_COLORS[self.element.category]
self.frame = frame = tk.Frame(
parent, relief=tk.RAISED,
name=f'frame_{self.element.symbol}',
background=self.background,
border=3border=self.BORDER,
)
self.frame.grid_columnconfigure(1, weight=2)
self.frame.grid(row=placed_element.row, column=placed_element.column, sticky=tk.EW)
self.populate()
self.set_grid()
frame.bind('<ButtonPress-1>', self.press)
frame.bind('<ButtonRelease-1>', self.release)
for child in frame.winfo_children():
child.bindtags([frame](frame,))
def populate(self) -> None:
prefix = f'label_{self.element.symbol}_'
tk.Label(
self.frame, name=prefix + 'number',
text=self.element.number, background=self.background,
).grid(row=0, column=0, sticky=tk.NW)
tk.Label(
self.frame, name=prefix + 'mass',
text=format_float(self.element.mass), background=self.background,
).grid(row=0, column=2, sticky=tk.NE)
tk.Label(
self.frame, name=prefix + 'name',
text=self.element.name, background=self.background,
).grid(row=1, column=0, sticky=tk.EW, columnspan=3)
tk.Label(
self.frame, name=prefix + 'symbol',
text=self.element.symbol, font='bold', background=self.background,
foreground=self.PHASE_COLORS[self.element.phase],
).grid(row=2, column=0, sticky=tk.EW, columnspan=3)
tk.Label(
self.frame, name=prefix + 'electronegativity',
text=format_float(self.element.electronegativity), background=self.background,
).grid(row=3, column=0, sticky=tk.SW)
tk.Label(
self.frame, name=prefix + 'density',
text=format_float(self.element.density), background=self.background,
).grid(row=3, column=2, sticky=tk.SE)
def set_grid(self) -> None:
self.frame.grid_rowconfigure(1, weight=2)
self.frame.grid_columnconfigure(1, weight=2)
period, group_name = self.element.period, self.element.group
if group_name == 'La':
group = ElementButton.la_offset + ElementButton.OFFSET
ElementButton.la_offset += 1
period += ElementButton.OFFSET
elif group_name == 'Ac':
group = ElementButton.ac_offset + ElementButton.OFFSET
ElementButton.ac_offset += 1
period += ElementButton.OFFSET
else:
group = group_name
self.frame.grid(row=period - 1, column=group - 1, sticky=tk.EW)
def press(self, event: tk.Event) -> None:
self.frame.configure(relief='sunken')
def release(self, event: tk.Event) -> None:
self.frame.configure(relief='raised')
webbrowser.open(
url=f'https://de.wikipedia.org/wiki/{self.element.name}',
new=2, autoraise=True,
)
def main() -> None:
setlocale(LC_ALL, 'de-DE.UTF-8')
with open('elements.json', encoding='utf-8') as f:
elements = json.load(f)
root = tk.Tk()
root.title('Periodensystem der Elemente')
frame = tk.Frame(root, name='grid_container')
frame.pack_configure(
fill=tk.BOTH,)
expand=tk.YES,
anchor=tk.N,
elements = tuple(place_elements(load_json()))
for element_dataelement in elements:
element = Element(**element_data)
ElementButton(frame, element)
n_columnscolumns = ElementButton{elm.la_offsetcolumn +for ElementButton.OFFSETelm in elements}
for x in range(n_columns)columns:
frame.grid_columnconfigure(index=x, weight=1)
root.mainloop()
if __name__ == '__main__':
main()

