【问题标题】:Why pygame keycodes are os-specific?为什么 pygame 键码是特定于操作系统的?
【发布时间】:2015-02-16 15:17:09
【问题描述】:

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

例如,US-Standard Layout 上“ACUTE/TILDE”的键码是 96。我检查了很多次。现在,在 POSIX 上,当我检查时,我得到 39(这同样适用于所有其他人)。这基本上意味着:如果我指的是 pygame 名称,比如 pygame.K_UP,无论如何。但是如果我直接引用键码,它们会根据操作系统而有所不同(这基本上意味着我必须在我的引擎上检测操作系统并相应地定义常量。很无聊。)

不管怎样,我很好奇。为什么?

【问题讨论】:

  • 如果 pygame 名称有效,为什么不直接使用它们?

标签: python input keyboard pygame keycode


【解决方案1】:

让我先说我没有任何在 windows 或 mac 系统上输入的经验,但这里是在 linux 端发生的事情。

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

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

对于 SDL(PyGame 充当包装器),扫描码/键码的区别有点模糊,并不是特别重要。它报告的“扫描码”实际上是键码,您会注意到 pygame'sevent.scancode 将匹配 xev 中打印的“键码”值。 SDL 称为“sym”,pygame 称为“key”,实际上是 SDL 特定的键码。键符由事件的“unicode”值表示。

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

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

我想留下一些链接以供进一步阅读,但我不确定要链接到什么。我暂时将SDL Input Guide 留在这里。

【讨论】:

  • 这是一个非常好的答案@kalhartt,非常感谢!我会检查链接。很明显,添加“输入配置菜单”的概念要好得多(我也会使用名称)。实际上,我不知道它们会改变,所以我更喜欢键码(例如,我可以通过简单地检查它们并创建一个“范围常数”,它们的列表来访问一系列键码)。但我现在明白了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 2017-07-29
相关资源
最近更新 更多