我正在尝试编写一些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()