用pythion接收dbus信号



我正在尝试编写一些python来监听信号。

使用dbus监视器,如下所示,我可以过滤我想要的信号。

dbus-monitor "type='signal',sender='org.kde.KWin',path='/ColorCorrect',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'"
signal time=1653997355.732016 sender=:1.4 -> destination=(null destination) serial=13165 path=/ColorCorrect; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.kde.kwin.ColorCorrect"
array [
dict entry(
string "enabled"
variant             boolean false
)
]
array [
]

但当我用python做同样的事情时,见下文,什么都不会打印出来。

import dbus
from gi.repository import GLib
from dbus.mainloop.glib import DBusGMainLoop

def signal_handler(*args, **kwargs):
for i, arg in enumerate(args):
print("arg:%d        %s" % (i, str(arg)))
print('kwargs:')
print(kwargs)
print('---end----')

DBusGMainLoop(set_as_default=True)
bus = dbus.SystemBus()
# register your signal callback
bus.add_signal_receiver(signal_handler,
bus_name='org.kde.KWin',
interface_keyword='org.freedesktop.DBus.Properties',
member_keyword='PropertiesChanged',
path_keyword='/ColorCorrect'
# message_keyword='msg')
)
loop = GLib.MainLoop()
loop.run()

您可能感兴趣的是:NightColor.py用于从终端设置温度,它解释了使用pydbus来传达KWin使用代号"ColorCorrect"完成的夜间颜色效果

解决方案

请参阅pydbus的文档,连接到总线:

通常有两个总线守护进程您可能感兴趣。每个用户登录会话都应该有一个会话总线,它是该会话的本地总线。它用于在桌面应用程序之间进行通信。通过创建SessionBus对象连接到会话总线:

from pydbus import SessionBus
session_bus = SessionBus()

KDE中的会话总线

默认值:会话总线

来自dbus-monitor手册页:

选项--system监控系统消息总线。--session监视会话消息总线。(这是默认。)

因此,您在输出中看到的消息显然来自默认会话总线。

KDE的开发者指南:访问D-bus接口:中解释了相同的默认总线

QDBusInterface对象表示给定的D-Bus接口。构造函数(按顺序)接受服务名称、对象路径、可选接口以及要使用的总线(例如系统会话)作为参数。如果没有明确定义总线,则默认为会话总线。如果没有给出接口,则返回的对象将用于调用总线上的所有接口。

注意

KDE的Plasma Desktop窗口管理器KWin(org.kde.KWin)的给定DBus服务名称也可以有后缀,请参阅环境变量KWIN_DBUS_SERVICE_SUFFIX

DBus服务名称"org.kde.KWin"的后缀。如果设置,名称将更改为"org.kde.KWin.${KWIN_DBUS_SERVICE_SUFFIX}"

您正在使用系统总线。CCD_ 11是会话总线的服务。尝试:

bus = dbus.SessionBus()

最新更新