使用KNotify更新通知

4 投票
2 回答
1811 浏览
提问于 2025-04-16 06:37

我把一个用gnome写的python脚本改成了每次Spotify换曲时使用KDE的通知。下面是代码:

#!/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) 用一个ID来更新事件,使用knotify.update?我觉得可以,但我不知道怎么检查事件最开始是否存在,以便第一次用knotify.event,后面再用knotify.update。

b) 在30秒后关闭这个事件(大概)。

c) 在歌曲结束时关闭事件(比选项b更好),但同样面临追踪ID的问题,我还没搞明白怎么做。

谢谢大家的帮助,

哦,还有,如果有人知道怎么让通知时不发出小“钢琴”声,那就太好了!

Steve

2 个回答

3

更简单的方法是在创建通知事件时设置一个超时时间:

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

这个超时时间是一个整数,表示毫秒数。

1

事件方法返回一个整数,这个整数就是通知的ID。所以,你可以用这个ID来关闭或者更新已经存在的通知:

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

time.sleep(30) 

knotify.closeNotification(id)

如果你需要检查这个通知是否已经存在,可以把这个ID写入一个临时文件,等等。

撰写回答