0

我对 python 相当陌生,正在尝试创建一个自定义模块,我可以使用 evdev 为我的树莓派导入该模块(不是那么重要)。我的问题是我需要一个好方法来知道何时按下给定按钮,最好使用 True/False。如果我要导入此模块并使用 read_stream() 函数,那么能够收集多种类型的输入的最简单方法是什么。(只是为了澄清,gamepad.read_loop() 每次迭代只返回一个值。

from evdev import InputDevice, categorize, ecodes

aBtn = 304
bBtn = 305
xBtn = 307
yBtn = 308

LBmper = 310
RBmper = 311

MenuBtn = 315
WindowBtn = 314
XboxBtn = 316

HorizontalDp = 16
VerticalDp = 17

RightT = 5
LeftT = 2

LeftStickClick = 317
RightStickClick = 318

Ls_X = 0
Ls_Y = 1
Rs_X = 3
Rs_Y = 4

def read_stream(input_path, trigger_deadzone):
    '''Begins the loop that reads all of the incoming events.'''
    button_list = ['aBtn_pressed', 'bBtn_pressed', 'xBtn_pressed', 'yBtn_pressed', 'lBmper_pressed', 'rBmper_pressed', 'mBtn_pressed', 'wBtn_pressed', 'xbxBtn_pressed', 'rDp_pressed', 'lDp_pressed', 'dDp_pressed', 'uDp_pressed', 'Ls_clicked', 'Rs_clicked', 'Ls_right', 'Ls_left', 'Ls_down', 'Ls_up', 'Rs_right', 'Rs_left', 'Rs_down', 'Rs_up', 'Lt_custom', 'Rt_custom']
    for button in button_list:
        button = False
    gamepad = InputDevice(input_path)
    if (not "Microsoft X-Box One S pad" in str(gamepad)):
        raise Exception("Invalid input device, please make sure you are using an Xbox One S controller.\nAlso make sure that the correct input path is set.")
    print("Stream is reading: ", gamepad)
    for event in gamepad.read_loop():
        value = event.value
        code = event.code
        if (code == aBtn):
        #if (304 <= code <= 308):
            if (code == aBtn):
                if (value == 1):
                    aBtn_pressed = True
                else:
                    aBtn_pressed = False
            elif (code == bBtn):
                if (value == 1):
                    bBtn_pressed = True
                else:
                    bBtn_pressed = False
            elif (code == xBtn):
                if (value == 1):
                    xBtn_pressed = True
                else:
                    xBtn_pressed = False
            else:
                if (value == 1):
                    yBtn_pressed = True
                else:
                    yBtn_pressed = False
        else:
            print("Unfiltered stream input.")
4

1 回答 1

0

很难确切地确定您要问什么,但如果您希望每次调用该函数时每个按钮的状态,一种方法是每次都在字典中返回当前值。

例如:

buttons = {
   304:"A",
   305:"B",
   307:"X",
   308:"Y" )

# and then your read stream function would be modified to look like

pressed = dict()
for event in gamepad.read_loop():
   btn = buttons[event.code]
   pressed[btn] = bool(event.value)
return pressed
于 2021-01-13T06:36:13.467 回答