桌面/根窗口上的键盘/鼠标事件,在Linux上使用pygtk(gtk.gdk)

时间:2010-12-27 22:06:39

标签: python linux gtk pygtk gdk

正如标题所述,我正在尝试使用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 个答案:

答案 0 :(得分:3)

以下是我刚刚做过的一个例子,你可以根据它做出:

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()

立即启动脚本并点击任意关键字keyetvoilà(输出):

$ python gtk_script.py 
click
click
click
click

希望这可以提供帮助

答案 1 :(得分:0)

我猜这不能使用普通的Gtk完成,你必须让Xlib或其他形式的通信与服务器本身。除非您的应用程序在根窗口中运行。

当然,我错了。