如何使用Python的Notify库实现单条通知消息单独清除?
解决Notify通知点击单条删除的问题
我明白你的困扰——用Notify模块发的通知会被桌面环境归为一组,点一条全删,而notify-send却能单独删除,但你又需要Notify的动作功能。这问题根源其实在桌面环境的通知分组逻辑上,我来给你搞定它!
问题原因
Cinnamon和GNOME会把同一个app_name标识的通知自动归为一组,所以点击组内任意一条,系统会清除同组所有通知。你之前反复init/uninit更换程序名的方式不对,因为每次init后创建的通知会绑定到当前的app_name,频繁切换反而会导致状态混乱,没法实现真正的独立分组。
解决方案:给每个通知分配唯一的app_name
核心思路是:只初始化一次Notify,然后为每个通知设置独一无二的app_name,让桌面环境把它们当成不同来源的通知,这样点击时就只会删除对应单条了,同时还能保留添加动作的功能。
修改后的代码示例:
from gi.repository import Notify from subprocess import call import uuid # 只初始化一次,基础名称不影响后续自定义 Notify.init("My Base Notification App") # 第一条通知:设置唯一的app_name,同时添加自定义动作 def open_terminal(notification, action): call(["gnome-terminal"]) notification1 = Notify.Notification.new("Hi from Notify 1") # 用UUID生成唯一标识,避免重复 notification1.set_app_name(f"MyApp-Notify-{uuid.uuid4()}") notification1.add_action("open-term", "Open Terminal", open_terminal) notification1.show() # 第二条通知:用另一个唯一的app_name notification2 = Notify.Notification.new("Hi from Notify 2") notification2.set_app_name(f"MyApp-Notify-{uuid.uuid4()}") notification2.show() # 程序结束时再调用uninit即可 # Notify.uninit()
关键说明
- 不要反复调用
Notify.init()和Notify.uninit(),一次初始化足够用,频繁切换会打乱通知的关联状态。 - 动态生成通知时,可以用UUID、计数器或者业务唯一标识来生成
app_name,确保每条通知的标识都不重复。 - 这样设置后,每条通知在桌面环境里会被视为独立来源,点击删除时只会移除对应的那一条,完全和
notify-send的单条删除行为一致,同时你还能继续使用add_action添加自定义交互动作。
内容的提问来源于stack exchange,提问作者user1464409
相关产品推荐
相关产品推荐

