在Linux上使用pygtk (gtk.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
我猜这个事情用普通的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
希望这能帮到你