다음과 같은 알림을 생성하는 스크립트를 작성했습니다.
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를 사용하고 있으며 등을 통해 전송된 알림은 옵션 에 관계없이 5초 notify-send
동안만 pynotify
지속됩니다 (이것은 Gnome 3의 기본 동작입니다. 이유는 묻지 마세요). 또한 스택되지 않습니다. Gnome은 한 번에 하나의 알림만 표시합니다. 따라서 여러 팝업을 테스트할 수는 없지만 작동할 것입니다.libnotify
time
답변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
역시 작동하지 않았습니다. 이에 대한 참조는 저장할 수 없습니다.
그래서 제가 생각할 수 있는 유일한 것은 스크립트를 데몬과 클라이언트라는 두 부분으로 나누는 것입니다. 일단 실행되면 클라이언트는 알림 인스턴스를 참조하여 백그라운드에서 실행 중인 데몬과 통신해야 합니다.