我目前正在致力于将
vgamepad
移植到 Linux 的 PR。 vgamepad
用 python 模拟虚拟游戏手柄。
在 Linux 上,PR 使用 libevdev
进而创建 uinput
设备。pygame
来检查 vgamepad
虚拟游戏手柄的状态。
这些单元测试的代码可以在here获得。
它们在 Windows 上都通过了,但在 Linux 上都失败了。
(您可以在您的系统上进行测试:克隆存储库,签出
yb/linux
分支,按照 Linux 的先决条件说明进行操作,使用 pip install -e .
在本地安装并运行 test
目录中的 python 脚本)
在 Linux 上,
pygame
正确检测到 uinput
设备及其预期特性,因此以下测试成功:
# Check that only one gamepad is connected:
self.assertTrue(len(self.joysticks) == 1)
j = self.joysticks[0]
# Check that gamepad properties are correct:
name = j.get_name()
nb_axes = j.get_numaxes()
nb_balls = j.get_numballs()
nb_buttons = j.get_numbuttons()
nb_hats = j.get_numhats()
self.assertTrue(name == "Xbox 360 Controller")
self.assertEqual(nb_axes, 6)
self.assertEqual(nb_balls, 0)
self.assertEqual(nb_buttons, 11)
self.assertEqual(nb_hats, 1)
但是,无法正确检测到更多事件,因此此测试失败:
_ = pygame.event.get()
self.g.press_button(button=v_button)
self.g.update()
time.sleep(WAIT_S)
event = pygame.event.get()
print(event)
self.assertTrue(j.get_button(j_button))
此时,应该检测到
A
按钮被按下,事实上,游戏手柄测试网站 确实正确地将 A
按钮显示为按下状态。
然而,pygame
看不到该事件,我在此处添加的print
打印[]
。
最后,我使用真实的游戏手柄手动尝试了相同代码的修改版本,这次测试正确通过了。
请问有人知道为什么会发生这种情况吗?
谢谢您的帮助!
pygame.event模块需要在同一线程中的同一设备上进行初始化显示:
Pygame 通过事件队列处理所有事件消息传递。本模块中的例程可帮助您管理该事件队列。输入队列严重依赖 pygame.displaypygame 模块来控制显示窗口和屏幕模块。 如果显示器尚未初始化且未设置视频模式,事件队列可能无法正常工作。