【问题标题】:How do you listen for Mediakey events under gnome 3 using python?如何使用 python 在 gnome 3 下监听 Mediakey 事件?
【发布时间】:2013-10-07 19:16:46
【问题描述】:

我正在尝试在 Gnome 3 (Gnome Shell) 下侦听 MediaKey 事件。我找到的所有示例都是指使用 DBus 连接到 org.gnome.SettingsDaemon.MediaKeys。我的平台上似乎不存在此服务。

我正在尝试通过 GObject-Introspection 使用 Python 来执行此操作。例子说做这样的事情

from gi.reposiotry import Gio

connection = Gio.bus_get_sync(Gio.BusType.SESSION, None)
proxy = Gio.DBusProxy.new_sync(connection, 0, None, 'org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon/MediaKeys', 'org.gnome.SettingsDaemon.MediaKeys', None)

不出所料,这失败了。我是否缺少提供此服务的安装,还是必须以其他方式执行此操作?

更新

这是一个媒体键监听器,无论哪个窗口有焦点,它都会监听键事件。它适用于甚至没有自己的 GUI 并且是桌面范围的应用程序。这就是为什么我尝试了 Mediakeys DBus 服务,却发现我的桌面上没有它。

更新 2

我应该清楚,MediaKeys 服务不存在。我无法连接到服务并创建代理,因为它不存在。我想知道的是,我错过了安装,还是在 Gnome 3 更新之一中删除了此服务?如果它被删除,那么我如何在这个新环境中收听媒体密钥?我正在运行 Gnome 3.8.2。

更新 3

很抱歉应该首先提到这一点。有一天我会完善我的问题:-}。我正在运行 Gentoo。

【问题讨论】:

  • 我不确定你在哪里获得事件(拦截或直接),但经典的 connect("key-press-event", myfunc) 不会使用 event.key 向 myfunc 发送事件= ...?
  • 对不起,我不确定我明白你在说什么。我想要知道何时按下任何媒体键,无论哪个窗口具有焦点,或者我根本没有打开任何窗口,只是桌面。
  • @JamesHurford 您能否确认系统中是否存在媒体密钥 dbus 服务文件?你可以在/usr/share/dbus-1/services/下搜索。
  • 在基于 Debian 的系统上,gnome-settings-daemon 包提供了这个功能并且应该被安装。 apt-get install gnome-settings-daemon。您的示例代码有几个拼写错误,例如应该是/org/gnome...,而不是org/gnome...。您可以使用d-feet 应用程序来浏览 dbus 层次结构。
  • 我安装了 gnome-settings-daemon。它是 3.8.4 版本。我找不到该服务的 dbus 服务文件。我已经为此搜索了整个系统。是的,有一个错字,但这只是问题,而不是我的代码。是的,我确实使用了 d-feet,这就是我发现该服务甚至没有运行的方式。谢谢

标签: python gentoo gnome-shell


【解决方案1】:

你真的看过这个问题吗? can't get dbus signal listener to work in C with gnome multimedia keys

提问者说这段代码有效:

#!/usr/bin/env python
"""Printing out gnome multi media keys via dbus-python.
"""
import gobject
import dbus
import dbus.service
import dbus.mainloop.glib


def on_mediakey(comes_from, what):
    """ gets called when multimedia keys are pressed down.
    """
    print ('comes from:%s  what:%s') % (comes_from, what)
    if what in ['Stop','Play','Next','Previous']:
        print ('Got a multimedia key!')
    else:
        print ('Got a multimedia key...')

# set up the glib main loop.
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.Bus(dbus.Bus.TYPE_SESSION)
bus_object = bus.get_object('org.gnome.SettingsDaemon', 
                            '/org/gnome/SettingsDaemon/MediaKeys')

# this is what gives us the multi media keys.
dbus_interface='org.gnome.SettingsDaemon.MediaKeys'
bus_object.GrabMediaPlayerKeys("MyMultimediaThingy", 0, 
                               dbus_interface=dbus_interface)

# connect_to_signal registers our callback function.
bus_object.connect_to_signal('MediaPlayerKeyPressed', 
                             on_mediakey)

# and we start the main loop.
mainloop = gobject.MainLoop()
mainloop.run()

更新

您的问题似乎与您的 Gnome 发行版有关,正如其他人之前在 this bug report 中遇到的那样。所以也许你应该升级你的发行版。

【讨论】:

  • 要是这么简单就好了。谢谢,但正如我所说,MediaKeys 服务完全丢失了。没有 MediaKeys 服务,否则我不会有这个问题。抱歉,这可能是我的错,我应该更清楚我的要求。
  • 你试过安装gstreamer-dbus-media-servicegnome-settings-daemon吗?你用的是什么发行版?
  • 你可以查看这个错误报告:bugs.launchpad.net/ubuntu/+source/checkbox/+bug/967211
  • 感谢错误报告的帮助。它告诉我我应该升级,它可能会自行解决。你得到了最后一个有用的评论,谢谢:-)
  • 谢谢,但在赏金到期之前我没有时间尝试这个。无论如何我都会给你,因为我认为你可能是对的。
猜你喜欢
  • 2016-10-02
  • 2022-07-30
  • 1970-01-01
  • 2022-10-13
  • 2020-03-12
  • 1970-01-01
  • 2014-12-06
  • 2011-12-20
  • 1970-01-01
相关资源
最近更新 更多