PySimpleGUI/DemoPrograms/Demo_Notify_Integration.py

86 lines
2.9 KiB
Python
Raw Permalink Normal View History

import PySimpleGUI as sg
from notifypy import Notify
import tempfile
import base64
import os
"""
Demo of Notification integration with PySimpleGUI
You will need to install the py-notifypy package (note spelling!):
pip install notify-py
Displays an OS created notification
There are more options than those in this Demo... like all PySimpleGUI Demo Programs
the demo is meant to give you a starting point
For more info about the notifypy package, visit the project's GitHub
https://github.com/ms7m/notify-py
To show a notification, call the function provided: notify_popout
If you use a base64 icon, then a temp file will be created. If you wish to cleanup these
temp files (an optional step), then include this line of code when you close the window:
[os.remove(file) for file in notify_popout.temp_files] if hasattr(notify_popout, 'temp_files') else None
Copyright 2021 PySimpleGUI
"""
def notify_popout(title=None, message=None, icon=sg.DEFAULT_BASE64_ICON, app_name=None):
"""
Show a notification popout window
:param title: Title shown in the notification
:param message: Message shown in the notification
:param icon: Icon shown in the notification - defaults to PySimpleGUI icon. Should be a PNG file
:param app_name: Application name shown in the notification
"""
if not hasattr(notify_popout, 'temp_files'):
notify_popout.temp_files = []
notification = Notify()
notification.title = title
notification.message = message
tmp = None
if isinstance(icon, bytes):
with tempfile.TemporaryFile(suffix='.png', delete=False) as tmp:
tmp.write(base64.b64decode(icon))
tmp.close()
notification.icon = tmp.name
elif icon is not None:
notification.icon = icon
if app_name is not None:
notification.application_name = app_name
notification.send(block=False)
if tmp is not None:
notify_popout.temp_files.append(tmp.name)
def main():
"""
A little test application that demonstrates calling the notify_popout function
"""
layout = [ [sg.Text('My Window')],
[sg.T('Notification message:'), sg.Input(key='-IN-')],
[sg.B('Show Notification', bind_return_key=True), sg.Button('Exit')] ]
window = sg.Window('My PySimpleGUI Application', layout)
while True: # Event Loop
event, values = window.read()
if event == sg.WIN_CLOSED or event == 'Exit':
break
if event == 'Show Notification':
notify_popout(title=window.Title, message=values['-IN-'], app_name=window.Title)
window.close()
# enjoy the anti-pattern that cleans up the temp files
[os.remove(file) for file in notify_popout.temp_files] if hasattr(notify_popout, 'temp_files') else None
if __name__ == '__main__':
main()