Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pygame未正确感知caps lock和num lock状态的实际状态_Python_Pygame - Fatal编程技术网

Python pygame未正确感知caps lock和num lock状态的实际状态

Python pygame未正确感知caps lock和num lock状态的实际状态,python,pygame,Python,Pygame,对不起,这有点长。我想确保我完全描述了我所看到的和我已经尝试过的非常奇怪的行为 我正在编写一个python pygame程序,它接受键盘事件。我试图从键盘上获取数字输入,以及从键盘上的正常数字(以及其他输入)获取数字输入。但是,pygame报告的num lock key状态导致了一个问题,因为它与锁键的实际键盘状态不一致 基本原理非常简单,我有事件循环 while True: for event in pygame.event.get(): 获取KEYDOWN事件并检查要从event.

对不起,这有点长。我想确保我完全描述了我所看到的和我已经尝试过的非常奇怪的行为

我正在编写一个python pygame程序,它接受键盘事件。我试图从键盘上获取数字输入,以及从键盘上的正常数字(以及其他输入)获取数字输入。但是,pygame报告的num lock key状态导致了一个问题,因为它与锁键的实际键盘状态不一致

基本原理非常简单,我有事件循环

while True:
    for event in pygame.event.get():
获取KEYDOWN事件并检查要从event.mod位图应用的修改器没有问题,一切正常。然而,我发现了一些意想不到的事情。为了确保用户打算按键盘上的4键,而不是左箭头,程序需要检查num lock修改键的状态(KEYDOWN事件中event.key随附的event.mod标志)。同样,这很简单,但锁键(num lock和caps lock)有一个意外的问题,它们具有state并保持打开或关闭状态

问题是,当程序启动时,它不遵守num lock键的当前系统状态(在调查这一点时,我发现caps lock键也有相同的行为)。无论caps lock或num lock键是否开启(且LED指示灯亮起),pygame程序启动时,指示键处于关闭状态。我已经使用event.mod状态和使用pygame.key.get_mods()直接读取确认了这一点。我可以看到钥匙的LED状态,并可以判断钥匙是否打开。不管我是在锁关闭还是打开的情况下开始游戏,它总是报告mod为关闭。如果当我开始游戏时LED亮起,游戏报告为关闭,如果我按下锁键(关闭LED),游戏现在将开始指示mod已设置

更为复杂的是,如果您移出游戏窗口,然后更改锁定键的状态,然后返回,pygame将无法识别该状态已更改,并且仍会发送与以前相同的event.mod标志

看起来pygame实际上并没有跟踪锁定键的系统状态,而是假设它们在程序启动时处于关闭状态,并且只有在游戏有焦点时切换键时才感知到对键的更改

如前所述,我尝试了pygame.key.get_mods(),但它报告了与event.mod标志相同的不一致状态。我也尝试过pygame.key.set_mods(),但这只会改变状态的游戏视图,不会影响或提供一种方法来匹配锁键的基本系统状态(LED不会改变状态,也不会影响其他应用程序认为的状态,就像pygame认为的那样)

我做了很多搜索,没有发现任何提到pygame不跟踪caps lock和num lock键的系统状态的内容

这让用户完全困惑,他们可以看到caps lock或num lock指示灯亮起(或不亮),但游戏的行为与这些状态不一致

还有其他人看到过这个问题吗?你找到解决办法了吗

启动时,只要在caps lock(大写锁定)键打开的情况下运行此操作,然后在caps lock(大写锁定)关闭的情况下再次运行,即可重现此错误行为:

 #!/usr/bin/env python
import pygame

pygame.init()
pygame.display.set_mode((400, 400))
print(pygame.key.get_mods())

在caps lock打开或关闭的情况下运行时,我会打印出0,这表明它在程序启动时并没有获得正确的锁定状态。

是否使用循环with
pygame.event.get()
?如果您不使用它,那么pygame可能有关于键盘的旧信息-因为它使用来自系统的事件来识别按下的键,并将这些信息保存在一些值中,
。get_mods()
(类似于
get_keys()
)可能会从内部变量返回值,system.BTW中的非当前状态:在大多数系统中,当porgram的窗口未处于活动状态时,系统不会将带有键/鼠标信息的事件发送到此窗口-这就是为什么当您离开窗口并单击键时可能会得到错误值的原因。在Linux上,所有键都显示正确-但前提是我使用
pygame.event.get()
(或
pygame.event.pump()
)所有时间(在每个循环中)。如果没有
pygame.event.get()
(或
pygame.event.pump()
),循环中它将不起作用。顺便说一句:文档中甚至有关于它的信息-
“要使pygame与系统同步,您需要调用pygame.event.pump(),以保持所有内容的最新。”
@furas感谢您的评论。是的,我在pygame.event.get()中为事件使用标准的
循环结构,但它甚至比这更简单。如果您在启动pygame时启用caps或num lock,并立即执行
pygame.key.get\mods()
,它会告诉您它们已关闭。对于窗口未激活时发生的事件,我不希望它获取这些事件,但我希望它能够准确反映有状态密钥(如num lock)的真实系统状态。这些密钥应该从系统中获取,而不是在内部跟踪。您是否使用
pygame循环.event.get()
?如果您不使用它,pygame可能有关于键盘的旧信息-因为它使用系统中的事件来识别按下的键,并将这些信息保存在一些值和
.get_mods()
(类似于
get_keys()
)可能会从内部变量返回值,而不是系统中的当前状态。顺便说一句:在大多数系统中,当porgram的窗口未处于活动状态时,系统不会向该窗口发送带有键/鼠标信息的事件-这就是为什么当您离开窗口并单击键时可能会得到错误的值。在Linux上,所有键都正确显示-但只有在我使用
pygame时.event.get()