How Can I Get Input From An Xbox One Controller In Python?
I want to add controller support to games I make in Python, but I cannot find any Xbox One controller input module for Python. I need specifically Xbox One controller support. Than
Solution 1:
You can use pygame
as it reads joysticks (with the pygame.joystick
class), it really doesn't 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 joysticksfor i inrange(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 isprint ("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' buttonif event.button == 0:
print ("A Has Been Pressed")
Solution 2:
The inputs library can be used as an alternative to PyGame.
from inputs import get_gamepad
import math
import threading
classXboxController(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()
defread(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):
whileTrue:
events = get_gamepad()
for event in events:
if event.code == 'ABS_Y':
self.LeftJoystickY = event.state / XboxController.MAX_JOY_VAL # normalize between -1 and 1elif event.code == 'ABS_X':
self.LeftJoystickX = event.state / XboxController.MAX_JOY_VAL # normalize between -1 and 1elif event.code == 'ABS_RY':
self.RightJoystickY = event.state / XboxController.MAX_JOY_VAL # normalize between -1 and 1elif event.code == 'ABS_RX':
self.RightJoystickX = event.state / XboxController.MAX_JOY_VAL # normalize between -1 and 1elif event.code == 'ABS_Z':
self.LeftTrigger = event.state / XboxController.MAX_TRIG_VAL # normalize between 0 and 1elif event.code == 'ABS_RZ':
self.RightTrigger = event.state / XboxController.MAX_TRIG_VAL # normalize between 0 and 1elif 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()
whileTrue:
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.
Post a Comment for "How Can I Get Input From An Xbox One Controller In Python?"