может я не буду сильно оригинален от первого ответа, но покажу свой пример, как я это решил в свое время через pystray, есть отличия в реализации...
установим pystray
pip install pystray
Собственно, сам код ( я его почистил, но тут раб. пример)
import pystray
from PIL import Image
import os
import psutil
import sys
def on_quit_callback():
os.kill(os.getpid(), 9)
image = Image.open("icon.png")
menu_items = (("Выход", None, on_quit_callback),)
icon = pystray.Icon("name", image, "My icon", menu_items)
icon.run()
и обратите внимание чтобы закрыть приложение я использую os.kill(os.getpid(), 9)
, вместо sys.exit(
), что не совсем корректно (тут все от необходимости зависит), так что если Вам требуется что бы приложение закрылось штатно используйте sys.exit()
Если Вы дергните os.kill(os.getpid(), 9)
то приложение буду закрыто в любом случае самой ОС по PID, но Вы можете потерять данные, а в случае sys.exit()
программа Ваша должна уметь корректные обработчики для закрытия всех внутренних процессов, в противном случае приложение останется висеть не закрытым в списке работающих процессов..., но исчезнет из трея....