How can I get input from an Xbox One controller in Python?

How can I get input from an Xbox One controller in Python?

You can use pygame as it reads joysticks (with the pygame.joystick class), it really doesnt matter what type of controller you use for pygame. An example is we want to make python print A Has Been Pressed, when we press the a button.

import pygame
pygame.init()
joysticks = []
clock = pygame.time.Clock()
keepPlaying = True

# for al the connected joysticks
for i in range(0, pygame.joystick.get_count()):
    # create an Joystick object in our list
    joysticks.append(pygame.joystick.Joystick(i))
    # initialize them all (-1 means loop forever)
    joysticks[-1].init()
    # print a statement telling what the name of the controller is
    print (Detected joystick ),joysticks[-1].get_name(),
while keepPlaying:
    clock.tick(60)
    for event in pygame.event.get():
        # The 0 button is the a button, 1 is the b button, 2 is the x button, 3 is the y button
        if event.button == 0:
            print (A Has Been Pressed)

The inputs library can be used as an alternative to PyGame.

from inputs import get_gamepad
import math
import threading

class XboxController(object):
    MAX_TRIG_VAL = math.pow(2, 8)
    MAX_JOY_VAL = math.pow(2, 15)

    def __init__(self):

        self.LeftJoystickY = 0
        self.LeftJoystickX = 0
        self.RightJoystickY = 0
        self.RightJoystickX = 0
        self.LeftTrigger = 0
        self.RightTrigger = 0
        self.LeftBumper = 0
        self.RightBumper = 0
        self.A = 0
        self.X = 0
        self.Y = 0
        self.B = 0
        self.LeftThumb = 0
        self.RightThumb = 0
        self.Back = 0
        self.Start = 0
        self.LeftDPad = 0
        self.RightDPad = 0
        self.UpDPad = 0
        self.DownDPad = 0

        self._monitor_thread = threading.Thread(target=self._monitor_controller, args=())
        self._monitor_thread.daemon = True
        self._monitor_thread.start()


    def read(self): # return the buttons/triggers that you care about in this methode
        x = self.LeftJoystickX
        y = self.LeftJoystickY
        a = self.A
        b = self.X # b=1, x=2
        rb = self.RightBumper
        return [x, y, a, b, rb]


    def _monitor_controller(self):
        while True:
            events = get_gamepad()
            for event in events:
                if event.code == ABS_Y:
                    self.LeftJoystickY = event.state / XboxController.MAX_JOY_VAL # normalize between -1 and 1
                elif event.code == ABS_X:
                    self.LeftJoystickX = event.state / XboxController.MAX_JOY_VAL # normalize between -1 and 1
                elif event.code == ABS_RY:
                    self.RightJoystickY = event.state / XboxController.MAX_JOY_VAL # normalize between -1 and 1
                elif event.code == ABS_RX:
                    self.RightJoystickX = event.state / XboxController.MAX_JOY_VAL # normalize between -1 and 1
                elif event.code == ABS_Z:
                    self.LeftTrigger = event.state / XboxController.MAX_TRIG_VAL # normalize between 0 and 1
                elif event.code == ABS_RZ:
                    self.RightTrigger = event.state / XboxController.MAX_TRIG_VAL # normalize between 0 and 1
                elif event.code == BTN_TL:
                    self.LeftBumper = event.state
                elif event.code == BTN_TR:
                    self.RightBumper = event.state
                elif event.code == BTN_SOUTH:
                    self.A = event.state
                elif event.code == BTN_NORTH:
                    self.X = event.state
                elif event.code == BTN_WEST:
                    self.Y = event.state
                elif event.code == BTN_EAST:
                    self.B = event.state
                elif event.code == BTN_THUMBL:
                    self.LeftThumb = event.state
                elif event.code == BTN_THUMBR:
                    self.RightThumb = event.state
                elif event.code == BTN_SELECT:
                    self.Back = event.state
                elif event.code == BTN_START:
                    self.Start = event.state
                elif event.code == BTN_TRIGGER_HAPPY1:
                    self.LeftDPad = event.state
                elif event.code == BTN_TRIGGER_HAPPY2:
                    self.RightDPad = event.state
                elif event.code == BTN_TRIGGER_HAPPY3:
                    self.UpDPad = event.state
                elif event.code == BTN_TRIGGER_HAPPY4:
                    self.DownDPad = event.state




if __name__ == __main__:
    joy = XboxController()
    while True:
        print(joy.read())

The buttons and triggers are returned as a list in the read methode. So put in there what you need to be returned.

This is part of a script of the Tensorkart project by bzier. I just removed everything that was not related to capturing the controller inputs.

How can I get input from an Xbox One controller in Python?

Leave a Reply

Your email address will not be published.