为什么pygame键码是特定于操作系统的?

时间:2014-12-17 22:54:12

标签: python input keyboard pygame keycode

我有一个名为Ergame的引擎,它有一个名为erfunc的模块。我是在NT / Windows平台上写的,现在我在POSIX / Linux上。由于我发现pygame上的输入很多次都很模糊,我想在IBM-STANDARD-US-PC和ABNT2键盘布局之间创建一个明确的区别I've created several constants whose values are pygame-keycodes。我有问题。

例如," ACUTE / TILDE"的关键代码美国标准布局是96.我已多次检查过。现在,在POSIX上,当我检查时,我得到39(同样适用于所有其他人)。这基本上意味着:如果我引用pygame-name,就像pygame.K_UP那样。但是,如果我直接引用密钥代码,它们会根据操作系统的不同而有所不同(这基本上意味着我必须在我的引擎上检测操作系统并相应地定义常量。非常无聊。)

无论如何,我很好奇。为什么呢?

1 个答案:

答案 0 :(得分:2)

让我先说一下我在Windows或Mac系统上没有任何输入经验,但这是在Linux端发生的事情。

关键事件通常在到达程序之前进行三阶段处理。键盘生成扫描码。操作系统将扫描码转换为键码。键盘映射将键码转换为符号。

  • 扫描码是特定于硬件的并代表键盘上的位置
  • 键码是操作系统映射到扫描码的值,通常在/usr/include/linux/input.h
  • 中定义
  • Keysyms是映射到键盘代码的符号,由键盘映射定义。您可以使用xmodmap -pke
  • 进行检查

对于SDL(PyGame充当包装器),扫描码/键码的区别有点模糊,并不是非常重要。它报告为"扫描码"实际上是密钥代码,你会注意到pygame的event.scancode将匹配"密钥代码"在xev中打印的值。 SDL呼叫" sym",pygame呼叫"密钥"并且实际上是SDL特定的密钥代码。密钥由事件" unicode"表示。值。

这一点的重要部分在于您实际上并未获得原始扫描码,因此可以预期它取决于操作系统,而不是依赖于键盘。此外,如果您获得原始扫描码,您可能希望扫描码在位置而不是字符上等效。因此,所有row-1 col-1键都会产生与键盘布局无关的相同扫描码。

虽然执行操作系统检查并拥有大量常量表可能很无聊,但这通常是它的完成方式。好消息是SDL为你做了这个,所以你真的应该使用pygame.K_ *名称。如果支持多个键盘布局是一个问题,请考虑为每个布局添加输入配置菜单而不是硬编码表。

我想留下一些链接以供进一步阅读,但我不确定要链接到哪些内容。我现在暂时离开SDL Input Guide