我正在尝试Ctrl
Alt
direction key
在后台运行的 Python 脚本中捕获快捷键(例如)。当我尝试这样做时,我遇到了错误。我的代码如下:
import Xlib
import Xlib.display
def process_event(event):
keycode = event.detail
if event.type == Xlib.X.KeyPress:
print(keycode)
def main():
# current display
display = Xlib.display.Display()
rootWindow = display.screen().root
# catch keypress events
rootWindow.change_attributes(event_mask = Xlib.X.KeyPressMask)
keys = [10, 11]
for keycode in keys:
rootWindow.grab_key(
keycode,
Xlib.X.Mod1Mask, #Xlib.X.AnyModifier,
1,
Xlib.X.GrabModeAsync,
Xlib.X.GrabModeAsync
)
while True:
event = rootWindow.display.next_event()
process_event(event)
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
我得到的错误如下:
<class 'Xlib.protocol.request.QueryExtension'>
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 157, sequence_number = 10, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 157, sequence_number = 11, major_opcode = 33, minor_opcode = 0
Run Code Online (Sandbox Code Playgroud)
发生此错误的原因是 xlib 上的重复键绑定。最有可能的是其他应用程序已经在键绑定中使用它们。
我刚刚测试了与您在 Unity 和 Kde 上工作类似的按键绑定,但在我的 xfce4 上却无法工作,并出现类似错误。
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 483, sequence_number
= 10, major_opcode = 33, minor_opcode = 0
X protocol error:
<class 'Xlib.error.BadAccess'>: code = 10, resource_id = 483, sequence_number
= 11, major_opcode = 33, minor_opcode = 0
Run Code Online (Sandbox Code Playgroud)
更改键码或编辑其他应用程序键绑定(如果您知道哪个应用程序)将解决该问题。有时它是来自桌面环境的应用程序。
对于其他人来说,由于错误的密钥代码也可能会发生相同的错误。在问题中,它使用键码 10 和 11(正确值)。