Programm-Icon für Startmenü, Alt-TAB ... setzen (Linux)

Probleme bei der Installation?
Antworten
ran
User
Beiträge: 24
Registriert: Mittwoch 23. April 2025, 14:48

Hallo, zunächst, ich weiß nicht ob das hier hin gehört oder in allgemeine Fragen, sorry, falls ich das flasche Forum wählte.

Ich habe ein Linux Mint System, aktueller Stand, arbeite im venv mit python3, benutze VSC. Alle Bibliotheken sind aktuell, Programm läuft.

Ich habe mich nach einem Wochenende des Probierens davon verabschiedet ein eigenes Icon in der Titelleiste unterzubringen. Aber ich hätte es doch schon gerne im Startmenu, in der Progammleiste und im Alt-TAB gesehen, aber alles zusammen klappt nicht.

Zunächst erstellte ich ein eigenes Modul, um das in beliebige Programme einbinden zu können, testete es an einem kleinen tkinter-script und es funktionierte.

Code: Alles auswählen

# gui/pix/icon_manager.py

import tkinter as tk
from pathlib import Path
import platform


def set_app_icon(
    window: tk.Tk | tk.Toplevel,
    pix_dir: Path | str = None,
    filename: str | None = None,
    use_default: bool = True,
) -> None:
    """
    Lädt eine PNG oder ICO aus gui/pix und setzt sie als Fenster-Icon.
    Unter Linux iconphoto; unter Windows  bei
    .ico zusätzlich iconbitmap() 

    Parameter
    ----------
    window      : Tk-Haupt- oder Toplevel-Fenster
    pix_dir     : Verzeichnis mit Icons (default: dieses Modul)
    filename    : Name der Datei (z.B. 'app_icon.png'). Ohne Angabe
                  nimmt es die erste *.png oder *.ico.
    use_default : True: iconphoto global für alle Fenster,
                  False: nur für dieses Fenster.
    """
    # 1) Pix-Verzeichnis ermitteln
    if pix_dir is None:
        pix_dir = Path(__file__).parent
    pix_dir = Path(pix_dir)
    if not pix_dir.is_dir():
        raise FileNotFoundError(f"Pix-Verzeichnis nicht gefunden: {pix_dir}")

    # 2) Icon-Pfad suchen
    if filename:
        icon_path = pix_dir / filename
        if not icon_path.is_file():
            raise FileNotFoundError(f"Icon nicht gefunden: {icon_path}")
    else:
        pngs = sorted(pix_dir.glob("*.png"))
        icos = sorted(pix_dir.glob("*.ico"))
        if pngs:
            icon_path = pngs[0]
        elif icos:
            icon_path = icos[0]
        else:
            raise FileNotFoundError(f"Keine .png oder .ico in {pix_dir}")

    # 3) Unter Windows für .ico in der Titelleiste iconbitmap nutzen
    if platform.system() == "Windows" and icon_path.suffix.lower() == ".ico":
        window.iconbitmap(str(icon_path))
        return

    # 4) Andernfalls (PNG oder Linux/macOS ICO) native PhotoImage laden
    photo = tk.PhotoImage(file=str(icon_path))
    # 5) iconphoto aufrufen – use_default entscheidet, ob global
    window.iconphoto(use_default, photo)
    # 6) Referenz halten, damit Tk es nicht wegwirft
    window._icon_ref = photo
Dann wollte ich es in meinem aktuellen Projekt einsetzen - no go. Okay, dachte ich, dann übers Startmenu. Habe ein .desktop-File geschrieben und lokal gespeichert, dabei als icon den kompletten Pfad zu meinem pix-Verzeichnis gesetzt. No go.

Code: Alles auswählen

[Desktop Entry]
Type=Application
Name=blablub
Exec=/home/ich/Pfad/zum/python/im/venv /home/ich/Pfad/zur/Startapp.py
Icon=/home/ich/Pfad/zum/icon.png
Terminal=false
StartupWMClass=blablub, Blablub
Categories=Utility;
Eintrag erfolgt, aber als Icon nur ein schwarzer Kasten. Der wird auch im Alt-TAB angezeigt und in der Leiste.
Ich habe dann Icon = Folder geschrieben, jetzt wird das Folder-Symbol überall angezeigt. Dann rief ich sowohl in der start-app als auch im toplevel meinen icon_manager auf

Code: Alles auswählen

    root = tk.Tk(className="blablub")
    set_app_icon(root)
aber das Folder-Icon bleibt hartnäckig, nichts in der Leiste, nichts im Alt-TAB.

Langer Text, kurze Frage: Was denke oder mache ich falsch?
ran
User
Beiträge: 24
Registriert: Mittwoch 23. April 2025, 14:48

Hat sich erledigt. Das eigene Icon muss in ~/.icons liegen, dann wird es auch verwendet.
Antworten