Обновление уведомления с помощью KNotify - PullRequest
4 голосов
/ 05 ноября 2010

Я преобразовал скрипт Python gnome для использования уведомлений KDE каждый раз, когда Spotify отслеживает изменения.Код ниже:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Title: Spotify Notification Demo
Author: Stuart Colville, http://muffinresearch.co.uk
Modified to work with KDE: Steve Nixon
License: BSD

"""

import dbus
import gobject
from dbus.mainloop.glib import DBusGMainLoop

class SpotifyNotifier(object):

    def __init__(self):
        """initialise."""
        bus_loop = DBusGMainLoop(set_as_default=True)
        bus = dbus.SessionBus(mainloop=bus_loop)
        loop = gobject.MainLoop()
        self.spotify = bus.get_object("org.mpris.spotify", "/")
        self.spotify.connect_to_signal("TrackChange", self.track_changed)
        self.notify_id = None
        loop.run()

    def track_changed(self, metadata):
        """Handle track changes."""
        if metadata:

                title = unicode(metadata.get("title").encode("latin-1"), "utf-8")
                album = unicode(metadata.get("album").encode("latin-1"), "utf-8")
                artist = unicode(metadata.get("artist").encode("latin-1"), "utf-8")

                knotify = dbus.SessionBus().get_object("org.kde.knotify", "/Notify")

                knotify.event("warning", "kde", [], title, u"by %s from %s" % (artist, album), [], [], 0, 0, dbus_interface="org.kde.KNotify")

if __name__ == "__main__":
    SpotifyNotifier()

Это прекрасно работает для каждого уведомления, но оставляет запись в области KNotify на неопределенное время.

Могу ли я либо

a) обновитьсобытие с использованием идентификатора и knotify.update?Полагаю, что так, но я не знаю, как проверить, существует ли исходное событие, чтобы использовать knotify.event в первый раз, и knotify.update для каждого последующего.

b) Закройте событие через 30 секунд.(или около того)

c) Закройте событие в конце песни (лучше, чем вариант b), но возникает та же проблема с отслеживанием идентификаторов, которую я еще не определил, как это сделать)

Приветствует любую помощь,

О, также, если кто-нибудь знает, как остановить его, издавая небольшой "пианино" шум, когда он уведомляет, что это тоже будет здорово!

Ответы [ 2 ]

3 голосов
/ 04 декабря 2011

Проще было бы просто установить время ожидания при создании события уведомления:

knotify.event(event, fromApp, contexts, title, text, pixmap, actions, timeout, winId)

время ожидания - это целочисленное значение, представляющее миллисекунды.

1 голос
/ 11 января 2011

метод события возвращает int. Это идентификатор уведомления. Таким образом, Вы можете использовать его для закрытия, обновления существующих уведомлений:

id = knotify.event("warning", ....)

time.sleep(30) 

knotify.closeNotification(id)

Если вам нужно проверить, существует ли он уже, вы можете записать Id в файл tmp и т. Д.

...