首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Python中向DBUS公开信号?

如何在Python中向DBUS公开信号?
EN

Stack Overflow用户
提问于 2018-12-15 02:41:14
回答 1查看 469关注 0票数 0

我很清楚如何创建方法-然而,我希望使用Python公开一些信号,以便可以一次调用几个程序。

代码语言:javascript
运行
复制
class Bildschirm(dbus.service.Object):
    DBUS_NAME = 'hm.retro.Retro'
    DBUS_OBJECT_PATH = '/hm/retro/Retro'
    DBUS_INTERFACE = 'hm.retro.Retro'

    def __init__(self, _Visio):
        self.Visio = _Visio
        self.bus = dbus.SessionBus()
        bus_name = dbus.service.BusName(self.DBUS_NAME, bus=self.bus)

        super().__init__(bus_name, self.DBUS_OBJECT_PATH)


    @dbus.service.method(DBUS_INTERFACE, in_signature='i')
    def delta(self, nr):
        weiter = self.Visio.akt_sender_nr
        weiter = (weiter+nr) % SENDER_AM
        self.Visio.akt_sender_nr = weiter
        self.Visio.update_sender_labels()

        self.Visio.screen.force_update()
        self.Visio.screen.draw_next_frame()

    @dbus.service.signal(DBUS_INTERFACE)
    def config_change_visio(self):
        self.Visio.load_config()
        self.Visio.update_sender_labels()
        self.Visio.update_preset_labels()

        self.Visio.screen.force_update()
        self.Visio.screen.draw_next_frame()

但是,如果我尝试使用dbus-send调用信号:

代码语言:javascript
运行
复制
dbus-send --session --print-reply --dest=hm.retro.Retro /hm/retro/Retro hm.retro.Retro.config_change_visio

我收到一条错误消息:

代码语言:javascript
运行
复制
    Error org.freedesktop.DBus.Error.UnknownMethod: Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/dbus/service.py", line 654, in _message_cb
    (candidate_method, parent_method) = _method_lookup(self, method_name, interface_name)
  File "/usr/lib/python3/dist-packages/dbus/service.py", line 246, in _method_lookup
    raise UnknownMethodException('%s is not a valid method of interface %s' % (method_name, dbus_interface))
dbus.exceptions.UnknownMethodException: org.freedesktop.DBus.Error.UnknownMethod: Unknown method: config_change_visio is not a valid method of interface hm.retro.Retro

我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2018-12-25 08:20:00

如果您将--print-reply传递给dbus-send,则意味着您正在发送的消息类型是方法调用,因为只有方法调用才能得到回复。dbus-send手册页上写着:

代码语言:javascript
运行
复制
   --print-reply
       Block for a reply to the message sent, and print any reply received in
       a human-readable form. It also means the message type (--type=) is
       method_call.

dbus-send调用中删除--print-reply参数,然后添加--type=signal,它就应该可以工作了。

请注意,虽然它不应该影响此bug,但D-Bus信号名称使用CamelCase而不是underscore_case更为传统。D-Bus specification说:

在D-Bus上,成员名称通常由不带标点符号的大写单词组成(“驼峰大小写”)。方法名称通常应该是动词,比如GetItems,信号名称通常应该是事件的描述,比如ItemsChanged。

所以也许你的信号应该被称为VisioConfigChanged。类似地,也许您的方法应该被称为类似AddDelta的名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53785241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档