События клавиатуры / мыши на рабочем столе / в корневом окне с помощью pygtk (gtk.gdk) в Linux - PullRequest
3 голосов
/ 28 декабря 2010

Как гласит заголовок, я пытаюсь перехватить события мыши и клавиатуры с помощью Python-gtk.

Я легко могу сделать это с помощью python-xlib:

    self.display = display.Display()
    self.screen = self.display.screen()
    self.root_window = self.screen.root

    self.root_window.grab_pointer(1,
             X.ButtonPressMask | X.ButtonReleaseMask | X.Button1MotionMask,
             X.GrabModeAsync,
             X.GrabModeAsync,
             X.NONE, X.NONE,
             X.CurrentTime)

    self.root_window.grab_keyboard(1,
              X.GrabModeAsync,
              X.GrabModeAsync,
              X.CurrentTime)

Я вижу аналог с использованием функций gtk.gdk. *, Но мне просто не удается зафиксировать события в главном окне рабочего стола. Можно ли это сделать?

Вот как я пытался выполнить задачу ... (ALL_EVENTS_MASK был актом отчаяния;])

    self.root_window = gtk.gdk.get_default_root_window()
    self.root_window.set_events(gtk.gdk.ALL_EVENTS_MASK)
    gtk.gdk.event_handler_set(self.filter_callback)
    gtk.main()

    def filter_callback (self, *args):
        print args

Ответы [ 2 ]

3 голосов
/ 28 декабря 2010

Вот пример, который я только что сделал, и вы можете опираться на него:

import gtk


def on_key_press(widget, data=None):
    print "click"

if __name__ == '__main__':
    w = gtk.Window()

    # Connect the callback on_key_press to the signal key_press.
    w.connect("key_press_event", on_key_press)
    # Make the widget aware of the signal to catch.
    w.set_events(gtk.gdk.KEY_PRESS_MASK)

    w.show_all()

    gtk.main()

Запустите скрипт и нажмите любую клавишу с ключевым словом et voilà (Вывод):

$ python gtk_script.py 
click
click
click
click

Надеюсь, что это может помочь

0 голосов
/ 04 марта 2011

Я предполагаю, что это невозможно сделать с помощью обычного Gtk, и вам придется задействовать Xlib или другую форму связи с самим сервером.Если, возможно, ваше приложение не запущено в самом корневом окне.

Конечно, я могу ошибаться.

...