在Python中捕获鼠标点击

1 投票
1 回答
716 浏览
提问于 2025-04-18 00:23

我在我的Python代码中想要捕捉鼠标点击事件(不仅仅是在我创建的Gtk窗口中,而是在屏幕上的任何地方)。经过一番搜索,我发现了一个讨论xlib的帖子(太好了,我已经有这个依赖了)。

from Xlib import display, X

display = display.Display()
root = display.screen().root
root.change_attribute(event_mask = X.ButtonPressMask | X.ButtonReleaseMask)

while True:
    event = root.display.next_event()
    print(event)

问题是这段代码出现了错误,我就是找不到好的文档来解决这个问题……

X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 146, sequence_number = 9, major_opcode = 2, minor_opcode = 0

如果你对这个错误有什么想法,或者有其他方法可以做到这一点,那就太好了!

1 个回答

0

这里提到的BadAccess错误是因为“你试图选择一个事件类型,但这个事件类型一次只能被一个客户端选择,而此时已经有其他客户端选择了它。”

根据x11协议文档,在ChangeWindowAttributes请求中(请求代码是2,资源ID=146是你的根窗口ID):

多个客户端可以在同一个窗口上选择输入,它们的事件掩码是互不干扰的。当一个事件发生时,会通知所有感兴趣的客户端。然而,只有一个客户端可以同时选择SubstructureRedirect,只有一个客户端可以同时选择ResizeRedirect,只有一个客户端可以同时选择ButtonPress。如果试图违反这些限制,就会出现访问错误。

尝试只选择ButtonReleaseMask作为可能的解决方案。

撰写回答