#python-3.x #dbus
Вопрос:
В качестве учебного проекта я пытаюсь создать простое приложение таймера, запускаемое из командной строки и использующее уведомления на рабочем столе для отображения обратного отсчета. Проблема в том, что когда я пытаюсь обновить содержимое уведомлений на рабочем столе, каждую секунду на рабочем столе появляется новое уведомление. Мне нужно обновить содержание уведомления, но с его появлением.
Вот соответствующий код:
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, я ожидаю, что оно будет работать так, как вы хотите.
UINT32 заменяет идентификатор необязательного идентификатора уведомления, который заменяет это уведомление. Сервер должен атомарно (т. е. без мерцания или других визуальных сигналов) заменить данное уведомление на это. Это позволяет клиентам эффективно изменять уведомление, пока оно активно. Значение 0 означает, что это уведомление не заменит никакие существующие уведомления.