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

3 投票
2 回答
4990 浏览
提问于 2025-04-16 09:06

正如标题所说,我正在尝试使用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

我猜这个事情用普通的Gtk是做不了的,你可能需要用到Xlib或者其他方式和服务器直接沟通。除非你的应用程序是直接在根窗口里运行的。

当然,我也可能是错的。

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

现在运行这个脚本,然后点击任何一个关键词,看看结果吧(输出):

$ python gtk_script.py 
click
click
click
click

希望这能帮到你

撰写回答