You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:57:55