I hope you enjoy this bit of code.
I did!
Your symbols, keywords and values should have capitalised variable names since they're global constants. However, life would be easier if your symbols were integrated into your values, and keywords prepended with symbol
. Even better: none of this actually belongs in your code, and should be cut out to a database file. JSON is easiest but there are others; for instance CSV would be higher-density (but has weaker typing).
You have not enough German in some parts, and too much German in others. Your localised data (e.g. Stickstoff
) are fine. Schema (e.g. elementkategorie
) and code (e.g. kategorie_farben
) should not be localised and should be in English. Your floating-point rendering should use localised formats; in your case it will turn your decimal point into a comma.
Don't write n.A
in your database; use None
and convert that to a string on render.
Don't store root
in the global namespace.
Don't leave **kwargs
as a dictionary; instead make a simple @dataclass
or named tuple.
Don't over-abbreviate variables like BD
which should be BORDER
. Likewise, over-abbreviated tk keyword arguments like bg
have a full-form background
which should be used instead.
Rather than strings like e
, prefer constants in tk like tk.E
.
Your if c in ('La','Ac'):
is redundant and can be deleted.
Your flag
, <Enter>
and <Leave>
aren't doing anything so in my suggested code I deleted them.
Refactor your get_fg
to be a dictionary lookup.
Prefer the "has-a" pattern over the "is-a" pattern for your element frame class; in other words, instantiate a frame instead of inheriting one.
Consider adding a (German!) title to your window.
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.
Consider resizing your chart to the window by use of a container frame and pack_configure
.
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".
I thought about calling the according wikipedia site
This is easy via webbrowser
.
Suggested
elements.json
[
{
"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": "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
}
]
Python
import json
import tkinter as tk
import webbrowser
from locale import setlocale, LC_ALL, format_string
from typing import Optional, Union, Iterable, Iterator, NamedTuple
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)
def place_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 = ac_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, placed_element: PlacedElement) -> None:
self.element = placed_element.element
self.background = self.CATEGORY_COLORS[self.element.category]
self.frame = frame = tk.Frame(
parent, relief=tk.RAISED,
name=f'frame_{self.element.symbol}',
background=self.background,
border=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()
frame.bind('<ButtonPress-1>', self.press)
frame.bind('<ButtonRelease-1>', self.release)
for child in frame.winfo_children():
child.bindtags((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 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,
)
def main() -> None:
setlocale(LC_ALL, 'de-DE.UTF-8')
root = tk.Tk()
root.title('Periodensystem der Elemente')
frame = tk.Frame(root, name='grid_container')
frame.pack_configure(fill=tk.BOTH)
elements = tuple(place_elements(load_json()))
for element in elements:
ElementButton(frame, element)
columns = {elm.column for elm in elements}
for x in columns:
frame.grid_columnconfigure(index=x, weight=1)
root.mainloop()
if __name__ == '__main__':
main()

AttributeError: 'Element' object has no attribute 'flag'
. \$\endgroup\$test
is printed. I thought about calling the according wikipedia site or write info classes for each. Not sure what to do with it. \$\endgroup\$