我目前正在开发一个python项目,以便能够跨平台检测和解释按键事件作为字符/名称。我一直在使用python-xlib来为X11提供支持,但最近在将键盘事件的键码转换为适当的键名的过程中遇到了困难。从python密钥中获取keysym
我的代码快照是在这里:https://gist.github.com/SavinaRoja/7306962
麻烦,在使用PyKeyboardEvent类,在这里我能够检索关键事件的事件数据的具体产生,但不解释自己的键码来的keysyms。 Xlib.display的keycode_to_keysym函数无法正常工作。
在阅读有关X11并由xev实用程序源代码确认时,似乎要使用的适当Xlib函数是XLookupString。如果我使用这个函数编写C语言(我只是开始学习的一种语言)会很简单,但是我目前对于使用python函数感到困惑。我考虑了两种选择:我可能试图利用和扩展python-xlib的协议来调用XLookupString,或者我可能会尝试使用ctypes来调用XLookupString。我的代码包含在后者的尝试(没有功能,但显示我在哪里,在目前):
from ctypes import *
XLookupString = cdll.LoadLibrary('libX11.so').XLookupString
char_buffer = create_string_buffer(257)
keysym = c_int() # the important value
count = XLookupString(byref(event), # TypeError, not a ctypes instance
byref(char_buffer),
len(char_buffer),
keysym,
None)
我怀疑什么,我缺少的是对事件类蟒蛇,Xlib中转化为适当的能力用于XLookupString的C结构,或者将从X服务器接收到的数据(python-xlib解析为事件实例)解释为这样的结构的能力。我的猜疑是否正确?如果是这样,我需要学习什么工具?
在这一点上,我可能会错过很多关于python和C之间接口的基本信息和技巧,所以我会花时间在我的普通教育中修复这个差距。如果有人明确了解我的问题,或者我应该如何开展有关相关主题的研究,我很乐意听到它。
谢谢。我认为你对不混合和匹配python-xlib和自定义ctypes调用非常有用;我目前正在尝试消化python-xlib的协议。如果我理解正确,请求打包为二进制文件并通过套接字传递给X服务器,可选地接收来自服务器的响应。我担心在此框架中XLookupString可能不可用,因为OpCodes似乎控制服务器对数据的处理,而XLookupString不是核心协议。 http://www.x.org/wiki/Development/Documentation/Protocol/OpCodes/ – user1467345
@ user1467345:我的xlib不仅有点生疏,所以我不记得了,但是...因为XLookupString是扩展协议,还是因为它根本不是网络调用,而只是使用硬编码的客户端数据? – abarnert
我已经能够在[Xutil.h]中找到它的定义(http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/precise/libx11/precise/view/head:/include/X11/Xutil .h)但我仍然对这件事情一无所知。我正在寻找它的底层源代码;如果仅需要客户端数据,则可以在python中重新实现它。 – user1467345