使用 python 的 dbus 模块,是不是可以更新通知的内容而不会再次弹出?

Posted

技术标签:

【中文标题】使用 python 的 dbus 模块,是不是可以更新通知的内容而不会再次弹出?【英文标题】:Using python's dbus module, is it possible to update the contents of a notification without it poping up again?使用 python 的 dbus 模块,是否可以更新通知的内容而不会再次弹出? 【发布时间】:2021-08-16 20:28:00 【问题描述】:

作为一个学习项目,我正在尝试从命令行启动一个简单的计时器应用程序,并使用桌面通知来显示倒计时。问题是,当我尝试更新桌面通知的内容时,每秒都会在桌面上弹出一个新通知。我需要更新通知的内容,但它会弹出。

以下是相关代码:

def notify_low(self, title, message, update = 0):
    """Pushes a low priority d-bus notice, good for display current countdown"""
    return self.notify_intf.Notify("", 0, "checkmark", title, message, [], "urgency": 0, 3000)

def start(self, time_d):
    """Starts the actual timer"""
    self.time_s = time_d.total_seconds()

    self.notice_ID = self.notify_low("Countdown", str(datetime.timedelta(seconds=self.time_s)))

    while self.time_s > 0:
        time.sleep(1)
        self.time_s -= 1
        self.notify_low("Countdown", str(datetime.timedelta(seconds=self.time_s)), self.notice_ID)
    self.notify_low("Bing bong", "Times up!")

如果有人知道如何抑制通知弹出窗口或如何在没有弹出窗口的情况下进行更新,那将是一个很大的帮助。

【问题讨论】:

【参考方案1】:

根据文档位于:https://developer.gnome.org/notification-spec/

Notify 方法的第二个参数是replaces_id。在您的示例中,您将此设置为零,并且文档指出零值意味着您将获得新弹出窗口的行为,而不是更新现有弹出窗口的行为。如果您将该数字替换为 1 到 4294967295 之间的任何值,那么我希望它可以按您的意愿工作。

replaces_id UINT32 此通知的可选通知 ID 替换。服务器必须以原子方式(即没有闪烁或其他 视觉提示)用这个替换给定的通知。这允许 客户端在通知处于活动状态时有效地修改通知。一种 值为 0 表示此通知不会替换任何 现有通知。

【讨论】:

以上是关于使用 python 的 dbus 模块,是不是可以更新通知的内容而不会再次弹出?的主要内容,如果未能解决你的问题,请参考以下文章

dbus-python 如何获得原生类型的响应?

推荐使用 pydbus 或 dbus-python 有啥区别?

如何在 Windows 上运行 python dbus?

适用于 Windows 的 Dbus-Python

如何从 Python 将无符号值发送到 dBus

如何让 Python 看到通过 apt 安装的模块?