pygame 未检测到来自虚拟 uinput 设备 (Ubuntu Jammy) 的事件

问题描述 投票:0回答:1

我目前正在致力于将

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
打印
[]

最后,我使用真实的游戏手柄手动尝试了相同代码的修改版本,这次测试正确通过了。

请问有人知道为什么会发生这种情况吗?

谢谢您的帮助!

python linux pygame joystick uinput
1个回答
0
投票

pygame.event模块需要在同一线程中的同一设备上进行初始化显示:

Pygame 通过事件队列处理所有事件消息传递。本模块中的例程可帮助您管理该事件队列。输入队列严重依赖 pygame.displaypygame 模块来控制显示窗口和屏幕模块。 如果显示器尚未初始化且未设置视频模式,事件队列可能无法正常工作

© www.soinside.com 2019 - 2024. All rights reserved.