如何检测winotify操作按钮点击事件并在点击时调用指定函数
Winotify自定义按钮点击事件实现方案
Winotify 基于Windows原生Toast通知机制封装,要实现按钮点击后的自定义逻辑(比如点击后移除数组对应元素),不需要额外魔改源码,用库本身预留的回调接口就能实现,核心是不要给按钮绑定系统默认处理的内置动作,把按钮参数作为自定义标识透传到回调函数里处理。
实现步骤
- 给每个操作按钮设置唯一的自定义标识参数,不要把按钮的
launch属性填成网页链接、本地应用路径这类会被系统直接拦截处理的内容 - 注册通知激活回调函数,所有按钮点击、通知本体点击的事件都会触发这个回调,同时把你之前填的
launch参数传回来 - 在回调里解析参数,匹配到对应的数组元素,执行自定义的移除逻辑即可
可直接运行的代码示例
from winotify import Notification # 示例业务数组 data_list = [ {"uid": 101, "text": "任务A"}, {"uid": 102, "text": "任务B"}, {"uid": 103, "text": "任务C"} ] def handle_click(args: str): # 区分点击事件类型 if not args.startswith("remove:"): return # 提取要操作的元素唯一标识 target_uid = int(args.split(":", 1)[1]) # 执行数组移除逻辑 global data_list data_list = [i for i in data_list if i["uid"] != target_uid] print(f"元素移除完成,当前数组内容:{data_list}") # 构造通知 toast = Notification( app_id="你的业务应用名", title="列表操作通知", msg="点击下方按钮可移除对应条目" ) # 遍历数组给每个元素绑定对应操作按钮 for item in data_list: toast.add_action( label=f"移除{item['text']}", launch=f"remove:{item['uid']}" # 传入自定义标识,不要填链接/程序路径 ) # 注册点击回调 toast.register_activate_callback(handle_click) # 弹出通知 toast.show()
注意事项
- 回调触发的前提是你的主程序处于运行状态,如果通知弹出时程序已经完全退出,Windows会找不到回调入口,自然无法执行自定义逻辑
- 每个按钮的
launch参数必须保证全局唯一,不然无法区分用户点击的是哪个按钮对应的元素 - 如果之前给通知设置过全局的
launch值(点击通知本体触发的动作),注意和按钮的参数做区分,避免回调里逻辑混淆 - 打包成exe运行时,要保证
app_id参数固定,不要每次启动随机生成,否则会出现回调丢失的问题
内容的提问来源于stack exchange,提问作者ryanejoe
相关产品推荐
相关产品推荐

