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()