我正在尝试构建一个树莓派控制的机器人。特别是,我想使用游戏手柄来导航机器人。我在台式电脑上编写了以下代码来捕获游戏手柄输入:
import pygame
pygame.init()
joystick = pygame.joystick.Joystick(0)
joystick.init()
done = False
while not done:
event = pygame.event.poll()
if event.type == 1538:
print(event.dict['value'])
if event.type == 1540:
done = True
如果按下导航十字上的按钮,此代码将打印值(例如 (1, 0) ),如果按下另一个按钮,则此代码将终止。
当我在树莓派上运行此代码时,出现以下错误:
pygame.error: video system not initialized
我想问题是,我在命令行上运行代码,而 pygame 需要一个用于视频输出的窗口。但我不想有输出,我只想使用 pygame 读取输入。有没有办法配置 pygame 来做到这一点?
更新
似乎 pygame 无法实现我的目标(参见 rabbid76 的回答)。在寻找替代方案的过程中,我发现了模块inputs。下面的代码正是我想做的:
from inputs import get_gamepad
def isDirectionEvent(event):
if event.ev_type != 'Absolute':
return False
if event.code[0:7] != 'ABS_HAT':
return False
return True
def isTerminateEvent(event):
if event.ev_type != 'Absolute':
return False
if event.code != 'MSC_SCAN':
return False
return True
def getInput(event):
if event.code[8:9] == 'X' and event.state == 1:
return 'right'
if event.code[8:9] == 'X' and event.state == -1:
return 'left'
if event.code[8:9] == 'Y' and event.state == 1:
return 'backward'
if event.code[8:9] == 'Y' and event.state == -1:
return 'forward'
return 'stop'
done = False
while not done:
events = get_gamepad()
for event in events:
if isDirectionEvent(event):
print(getInput(event))
if isTerminateEvent(event):
done = True
pygame.event
:
Pygame 通过事件队列处理所有事件消息传递。本模块中的例程可帮助您管理该事件队列。输入队列严重依赖
模块来控制显示窗口和屏幕模块。如果显示屏尚未初始化并且未设置视频模式,事件队列可能无法正常工作。pygame.display
因此您需要一个窗口和视频系统来处理事件。