我编写了一个生成通知的脚本,如下所示:
notify-send -i audio-card "Transferring audio playback to speakers." \
"Audio playback has been transferred to the analog output speaker system."
有什么方法可以从命令行或 Python 清除或替换这些通知吗?本质上,我有一个在两个 PulseAudio 接收器之间切换的脚本,如果用户快速切换,我想清除以前的此类通知,以将其替换为更新的文本。
答案1
gdbus
在 CLI 中,您可以通过/显示和关闭通知弹出窗口qdbus
。
以下是如何做到这一点gdbus
:
gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.Notify my_app_name 42 audio-card "Message" "Body" [] {} 20
这将输出类似:
(uint32 72,)
72
是通知ID
。现在您知道了,ID
您可以使用以下命令关闭弹出窗口:
gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.CloseNotification 72
现在,如果您ID
稍后需要,只需在调用时将其写入文件即可Notify
:
gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.Notify my_app_name 42 audio-card "Message" "Body" [] {} 20 | sed 's/[^ ]* //; s/,.//' > /tmp/last_id
当你想关闭弹出窗口时从那里获取它:
gdbus call --session --dest org.freedesktop.Notifications --object-path /org/freedesktop/Notifications --method org.freedesktop.Notifications.CloseNotification $(cat /tmp/last_id)
PS 我使用的是 Gnome 3,通过 、 等发送的通知notify-send
仅pynotify
持续libnotify
5 秒,无论time
选项如何(这是 Gnome 3 中的默认行为,不要问我为什么)。而且,它们不会叠加:Gnome 一次仅显示一个通知。所以我无法测试多个弹出窗口,但它应该可以工作。
答案2
使用update
方法并show
再次调用方法:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pynotify
import time
pynotify.init("Basic")
n = pynotify.Notification("Title1", "body1", "dialog-warning")
n.show()
time.sleep(1)
n.update("Title2", "body2", "dialog-warning")
n.show()
更新:
方法是有的close
,但是……根本没用。显然,不仅对我来说:
- https://stackoverflow.com/questions/7149161/how-to-remove-an-obsolete-pynotify-notification
- https://bugs.launchpad.net/ubuntu/+source/notify-python/+bug/521951
我认为这可能是由于绑定错误引起的,所以我创建了这个C++程序:
#include <libnotify/notify.h>
#include <unistd.h>
int main(int argc, char **argv) {
GError *error = NULL;
notify_init("basic");
NotifyNotification *example;
example = notify_notification_new("Ttile1", "Body1", NULL);
notify_notification_show(example, &error);
usleep(1000000);
notify_notification_update(example, "Ttile2", "Body2", NULL);
notify_notification_show(example, &error);
usleep(1000000);
notify_notification_close(example, &error);
}
并编译它:
g++ test.cpp -o test $(pkg-config --libs --cflags libnotify)
但效果并不好。看来这里有什么问题。
接下来我尝试使用pickle
模块来保存引用 - 它也不起作用。您无法存储对这些的引用。
所以我唯一能想到的就是将你的脚本分成两部分:守护进程和客户端。运行后,客户端应参考通知实例与一直在后台运行的守护进程进行通信。