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
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;
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)
Langer Text, kurze Frage: Was denke oder mache ich falsch?