Notificación interactiva de Windows 10 usando Python

Sep 13 2020

Quería saber si era posible mostrar una notificación con Windows 10, que realiza una acción específica cuando se presiona. Conozco plyery win10toastpero en ambos módulos no veo una forma de configurarlo para que funcione con clics. Lo quería para que cuando lo presione, se abra un enlace o se ejecute alguna función para trabajar tkinter. Las preguntas aquí sobre SO sobre esto no tienen respuesta o son incompatibles ahora. tienen alguna idea?

Fragmento 1:

from win10toast import ToastNotifier

noti = ToastNotifier()
noti.show_toast('Random','Hello World',icon_path='ico.ico',duration=60)

Además, a pesar de darlo duration=60en ambos sentidos se cierra automáticamente después de aprox. 5 segundos.

Fragmento 2:

from plyer.utils import platform
from plyer import notification

notification.notify(
    title='Here is the title',
    message='Here is the message',
    app_name='Here is the application name',
    app_icon='path/to/the/icon.' + ('ico' if platform == 'win' else 'png')
)

Después de investigar un poco, encontré que win10toastfunciona win32gui, y alguna configuración podría hacer que funcione. Pero no estoy seguro de qué.

Gracias por adelantado

Respuestas

1 Karthik Sep 13 2020 at 13:10

Puede usar el callback_on_clickmétodo para realizar una devolución de llamada al hacer clic en la notificación.

Como se menciona en este hilo, la instalación de callback_on_click necesitaría instalar pip install -e git+https://github.com/Charnelx/Windows-10-Toast-Notifications.git#egg=win10toastya callback_on_clickque aún no se fusionó con wintoast.

Recibirá un error, pero su nueva versión de toastNotifierse copiará con la existente.

Tendría que importar en from src.win10toast.win10toast import ToastNotifierlugar de from win10toast import ToastNotifierordenar para acceder al callback_on_clickmétodo.

Compruebe el fragmento.

from src.win10toast.win10toast import ToastNotifier
import tkinter as tk
from tkinter import *
import webbrowser

top = tk.Tk()
top.geometry('50x50')
top.title('shop')

url = 'http://www.google.com'

def notify():
   noti.show_toast('Random','Hello World',duration=60, threaded=True,callback_on_click=action) 

def action():
    webbrowser.open_new(url)
    print("Done")
    
noti = ToastNotifier() 
btn = Button(top, text= "Enter", command=notify)
btn.pack()

top.mainloop()

NOTA: asegúrese de utilizar threaded=Truein show_toast()para que el resto de su programa pueda ejecutarse mientras el brindis aún esté activo. De lo contrario, su interfaz gráfica de usuario se congelaría.