Zahlensystemme-Rechner.py
import tkinter as tk
from tkinter import font as tkfont
import os
# =========================
# Hilfsfunktion: Punktmatrix-Font laden
# =========================
def lade_dotmatrix_font(name="DotMatrix", ttf="DotMatrix.ttf", size=16):
"""
Versucht DotMatrix.ttf aus dem aktuellen Ordner zu laden.
Fällt auf ('Courier', size) zurück, wenn Datei fehlt.
Gibt ein tkfont.Font-Objekt zurück.
"""
if os.path.exists(ttf):
try:
return tkfont.Font(file=ttf, size=size)
except Exception:
pass
return tkfont.Font(family="Courier", size=size)
# =========================
# Funktionen für Umrechnung
# =========================
def zeige_ergebnis(text):
eingabe_feld.delete("2.0", "end")
eingabe_feld.insert("end", f"\n{text}")
def bin_dez():
eingabe = eingabe_feld.get("1.0", "end-1c").strip()
try:
dez = int(eingabe, 2)
zeige_ergebnis(f"Dezimal: {dez}")
except ValueError:
zeige_ergebnis("Ungültige Binärzahl!")
def dez_bin():
eingabe = eingabe_feld.get("1.0", "end-1c").strip()
try:
binaer = bin(int(eingabe))[2:]
zeige_ergebnis(f"Binär: {binaer}")
except ValueError:
zeige_ergebnis("Ungültige Dezimalzahl!")
def dez_hex():
eingabe = eingabe_feld.get("1.0", "end-1c").strip()
try:
hexa = hex(int(eingabe))[2:].upper()
zeige_ergebnis(f"Hexadezimal: {hexa}")
except ValueError:
zeige_ergebnis("Ungültige Dezimalzahl!")
def hex_dez():
eingabe = eingabe_feld.get("1.0", "end-1c").strip()
try:
dez = int(eingabe, 16)
zeige_ergebnis(f"Dezimal: {dez}")
except ValueError:
zeige_ergebnis("Ungültige Hexadezimalzahl!")
def bin_hex():
eingabe = eingabe_feld.get("1.0", "end-1c").strip()
try:
dez = int(eingabe, 2)
hexa = hex(dez)[2:].upper()
zeige_ergebnis(f"Dezimal: {dez}\nHexadezimal: {hexa}")
except ValueError:
zeige_ergebnis("Ungültige Binärzahl!")
def hex_bin():
eingabe = eingabe_feld.get("1.0", "end-1c").strip()
try:
dezimal = int(eingabe, 16)
binaer = bin(dezimal)[2:]
zeige_ergebnis(f"Dezimal: {dezimal}\nBinär: {binaer}")
except ValueError:
zeige_ergebnis("Ungültige Hexadezimalzahl!")
def loeschen():
eingabe_feld.delete("1.0", tk.END)
def beenden():
fenster.destroy()
# =========================
# UI-Setup
# =========================
fenster = tk.Tk()
fenster.title("Alex Zahlensystem-Umrechner")
fenster.geometry("480x380")
fenster.resizable(True, True)
# Farben (Retro-Look)
BG_DUNKEL = "#1B1F22"
PANEL_BG = "#232A2F"
TASTEN_BG = "#2F3942"
TASTE_AKTIV = "#3A4751"
NEON_GRUEN = "#00FF00"
WARN_ROT = "#E0807E"
AKZENT_BLAU = "#4C6EEB"
fenster.configure(bg=BG_DUNKEL)
# Fonts
dot_font = lade_dotmatrix_font(size=18)
ui_font = tkfont.Font(family="Segoe UI", size=10)
titel_font = tkfont.Font(family="Segoe UI", size=12, weight="bold")
# Oberer Rahmen
top_frame = tk.Frame(fenster, bg=PANEL_BG)
top_frame.grid(row=0, column=0, columnspan=4, padx=12, pady=12, sticky="nsew")
titel = tk.Label(
top_frame,
text="Bitte Zahl Eingaben",
bg=PANEL_BG,
fg="#B7C0C8",
font=titel_font
)
titel.pack(anchor="w", padx=8, pady=(6,4))
# Eingabefeld (leer beim Start!)
eingabe_feld = tk.Text(
top_frame,
width=46, height=6,
bg="#111416", fg=NEON_GRUEN,
insertbackground=NEON_GRUEN, # Grüner Cursor
bd=0, relief="flat",
padx=10, pady=8,
font=dot_font
)
eingabe_feld.pack(fill="both", expand=True, padx=8, pady=(0,8))
# Button-Hilfsfunktion
def mk_button(text, cmd, r, c, bg=TASTEN_BG, fg="#E6EDF3"):
b = tk.Button(
fenster,
text=text,
command=cmd,
width=12,
height=2,
bg=bg,
fg=fg,
activebackground=TASTE_AKTIV,
activeforeground=fg,
relief="flat",
font=ui_font,
cursor="hand2"
)
b.grid(row=r, column=c, padx=6, pady=6, sticky="nsew")
return b
fenster.grid_columnconfigure((0,1,2,3), weight=1)
fenster.grid_rowconfigure(3, weight=1)
# Buttons
mk_button("BIN → DEZ", bin_dez, 1, 0)
mk_button("DEZ → BIN", dez_bin, 1, 1)
mk_button("DEZ → HEX", dez_hex, 1, 2)
mk_button("HEX → DEZ", hex_dez, 1, 3)
mk_button("BIN → HEX", bin_hex, 2, 0)
mk_button("HEX → BIN", hex_bin, 2, 1)
mk_button("Löschen", loeschen, 2, 2, bg=WARN_ROT, fg="white")
mk_button("Beenden", beenden, 2, 3, bg=AKZENT_BLAU, fg="white")
# Shortcuts
fenster.bind("", lambda e: beenden())
fenster.bind("", lambda e: loeschen())
fenster.bind("", lambda e: bin_dez())
fenster.mainloop()