User Tools

Site Tools


python:systray

This is an old revision of the document!


Py Systray

https://stackoverflow.com/questions/47095129/pystray-systray-icon

https://stackoverflow.com/questions/9494739/how-to-build-a-systemtray-app-for-windows

https://pystray.readthedocs.io/en/latest/index.html

https://github.com/moses-palmer/pystray

https://github.com/PySimpleGUI/PySimpleGUI/tree/master/PySimpleGUIWx
https://www.reddit.com/r/Python/comments/a9t466/system_tray_icon_get_status_launch_programs_popup/

Example:

pip install pystray pillow
#!/usr/bin/python
#import pystray
from pystray import Icon as icon, Menu as menu, MenuItem as item
from PIL import Image
import os, sys

def action():
    pass

def action_restart():
    """Restarts the current program, with file objects and descriptors
       cleanup
    """

    try:
        p = psutil.Process(os.getpid())
        for handler in p.get_open_files() + p.connections():
            os.close(handler.fd)
    except Exception as e:
        #logging.error(e)
        pass

    icon.visible = False
    python = sys.executable
    os.execl(python, python, *sys.argv)
    #os.execv(sys.executable, ['python'] + sys.argv)

def action_quit():
    icon.visible = False
    print("Exiting application")
    os._exit(0)

def launch():
    i = 0;
    while i<1000000:
        print(i)
        i += 1
    pass

def resource_path(relative_path):
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

image = Image.open(resource_path("systrayicon.png"))
#icon = pystray.Icon(name ="just text", icon =image, title ="Other Text", menu =None)
menu = (item('name', action), item('Restart', action_restart), item('Exit', action_quit))
icon = icon("name", image, "title", menu)

def run_call(icon):
    if icon is not None:
        icon.visible = True
    launch()

icon.run(run_call)

Create version file using:

pip install pyinstaller_versionfile
import pyinstaller_versionfile

pyinstaller_versionfile.create_versionfile(
    output_file="version.txt",
    version="1.2.3.4",
    company_name="My Imaginary Company",
    file_description="Simple App",
    internal_name="Simple App",
    legal_copyright="© My Imaginary Company. All rights reserved.",
    original_filename="SimpleApp.exe",
    product_name="Simple App"
)

To build as single file with additional data like images, the resource_path function needs to be included and pyinstaller needs to use the –add-data option. On Windows a semicolon is required, on linux a colon works.

wine pyinstaller.exe --onefile --icon=systrayicon.ico --add-data "systrayicon.png;." --version-file=version.txt systraytest.py

Pyinstaller options:

--onefile: Creates a single file. Synonyms: -F
--windowed: Ensures that no console is opened during execution. Synonyms: -w and --noconsole
--add-data: adds data to the file using "source:target" or "source;target"
--version: adds exe file version information
--icon: adds windows application icon file
python/systray.1675132230.txt.gz · Last modified: 2023/05/29 11:53 (external edit)