Benutzer-Werkzeuge

Webseiten-Werkzeuge


python:snippets:bildschirm

Bildschirmsteuerungen

auf voriges Fenster zurückspringen

Will man z.B. nach einer Messagebox wieder auf das vorherige Fenster zurückspringen, hilft folgendes Snippet

fenster.lift()
fenster.focus_force()

Parameter: fenster = der Fenstername.

Rückgabe: keine
Beachte: bei Funktionen, die an sich kein Fenster haben, das übergeordnete Fenster im Aufruf der Funktion zu übergeben.

Habe ich das Fenster akuell nicht zur Verfügung, funktioniert das so:

def edit_entry(self) -> None:
    """
    Öffnet ein Bearbeitungsfenster für den ausgewählten Depotbestand.
    Zeigt Warnung, wenn kein Eintrag ausgewählt ist.
    """
    selected = self.tree.focus()
    if not selected:
        messagebox.showwarning("Hinweis", "Bitte einen Eintrag auswählen.")
        # Fokus explizit auf das aktuelle Fenster und die Treeview setzen
        self.top.lift()           # Falls du ein Toplevel-Fenster hast, bring es nach vorne
        self.top.focus_force()    # Setzt den Fokus auf das Fenster
        self.tree.focus_set()     # Setzt den Fokus auf die Treeview
        return
    data = self.tree.item(selected, "values")
    self.open_entry_window(data)

Create Tooltip

Möchtre ich einen Tooltip auf ein Widget, Feld oder Button plazieren:

def create_tooltip(widget, text):

    """

    Erstellt einen schwebenden Tooltip für ein Widget, der bei Mouseover angezeigt wird.
    Args:
        widget (tk.Widget): Das Widget, für das der Tooltip erstellt wird.
        text (str): Der anzuzeigende Text im Tooltip.
    Returns:
        None")
    """

    tooltip = tk.Toplevel(widget)
    tooltip.withdraw()  # Tooltip zunächst unsichtbar machen
    tooltip.overrideredirect(True)  # Entfernt Fensterrahmen
    tooltip_label = tk.Label(
        tooltip,
        text=text,
        background="lightyellow",
        relief="solid",
        borderwidth=1,
        font=("Arial", 12)
    )
    tooltip_label.pack()
    def show_tooltip(event):
        x = widget.winfo_rootx() + event.x + 20
        y = widget.winfo_rooty() + event.y
        tooltip.geometry(f"+{x}+{y}")
        tooltip.deiconify()  # Tooltip anzeigen
    def hide_tooltip(event):
        tooltip.withdraw()  # Tooltip verstecken
    widget.bind("<Enter>", show_tooltip)
    widget.bind("<Leave>", hide_tooltip)

Fenster existiert?

def ensure_window_exists(db_name, view_windows):
    """
    Überprüft, ob für die gegebene Datenbank bereits ein Fenster existiert und hebt es hervor.
    Args:
        db_name (str): Name der Datenbank bzw. der zugehörigen Ansicht.
        view_windows (dict): Wörterbuch, das Fensterobjekte anhand ihrer Datenbanknamen speichert.
    Returns:
        bool: True, falls ein entsprechendes Fenster existiert und sichtbar ist, sonst False.

    """

    if db_name in view_windows and view_windows[db_name].winfo_exists():
        view_windows[db_name].lift()
        view_windows[db_name].focus_force()
        return True
    return False

Fenster zentrieren

Will man ein Fenster in Breite und Höhe in Abhängigkeit von der Bildschirmauflösung zentrierenk hilft folgende Lösung.

# Bildschirmauflösung holen

    screen_width = window.winfo_screenwidth()
    screen_height = window.winfo_screenheight()
    # Falls Breite/Höhe nicht angegeben, skaliert berechnen
    width = width or int(screen_width * scale)
    height = height or int(screen_height * scale)
    # Begrenzung auf Bildschirmgröße
    width = min(width, screen_width)
    height = min(height, screen_height)
    # Zentrierte Position berechnen
    x = (screen_width - width) // 2
    y = (screen_height - height) // 2
    # DPI-Skalierung berücksichtigen (für 4K/HiDPI)
    try:
        window.tk.call('tk', 'scaling', window.winfo_fpixels('1i') / 72.0)
    except Exception:
        pass
    window.geometry(f"{width}x{height}+{x}+{y}")

Parameter:
window (tk.Tk | tk.Toplevel): Fensterobjekt
width (int, optional): Exakte Breite
height (int, optional): Exakte Höhe
scale (float, optional): Verhältnis zur Bildschirmauflösung (Standard: 0.8)
Rückgabe:
None

Theemed Widgets

ttk bringt einen einheitlichen Ansatz, um über vordefinierte oder eigene „Themes“ das gesamte Look & Feel deiner Anwendung zu steuern.

  • Du legst mit ttk.Style() einen Style-Manager an.
  • Dann definierst du unter einem Style-Namen („<Name>.<WidgetType>“) sämtliche Eigenschaften.
  • Alle Widgets dieses Typs, die du mit genau diesem Style-Namen erzeugst, übernehmen die Einstellungen automatisch.
from tkinter import ttk
style = ttk.Style()
# Basis-Theme auswählen (z. B. 'clam', 'alt', 'default', 'classic')
style.theme_use('clam')

# Dann benutzt du ttk.Button mit diesem Style
close_button = ttk.Button(
    root,
    text="Schließen",
    command=root.destroy,
    style='My.TButton'
)
close_button.pack(side=tk.LEFT, padx=5, pady=10)

Vorteile von ttk.style

  • Zentrales Styling für viele Widgets auf einmal
  • Einheitliche Themes (z. B. helle und dunkle Varianten)
  • Plattform-nahes Aussehen (Buttons wie auf Windows, macOS, …)
python/snippets/bildschirm.txt · Zuletzt geändert: von franz

Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki