2013-11-03 18 views
5

Ist es möglich, meine drahtlose Xbox 360 Controller für PC mit Python "rumble"? Ich habe nur eine Lösung gefunden, um die Eingabe zu lesen, aber ich kann keine Informationen über Vibration/Rumpeln finden.Ist es möglich, einen Xbox 360-Controller mit Python zu "rumble"?

EDIT:

den Code von @AdamRosenfield bereitgestellt Nach erhalte ich die folgende Fehlermeldung.

Traceback (most recent call last): 
    File "C:\Users\Usuario\Desktop\rumble.py", line 8, in <module> 
    xinput = ctypes.windll.Xinput # Load Xinput.dll 
    File "C:\Python27\lib\ctypes\__init__.py", line 435, in __getattr__ 
    dll = self._dlltype(name) 
    File "C:\Python27\lib\ctypes\__init__.py", line 365, in __init__ 
    self._handle = _dlopen(self._name, mode) 
WindowsError: [Error 126] The specified module could not be found. 

Plese beachten Sie, dass der letzte Fehler aus dem Spanischen übersetzt wurde.

Antwort

4

Es ist möglich, aber es ist nicht einfach. In C würden Sie das XInputSetState() function verwenden, um das Grollen zu steuern. Um von Python darauf zuzugreifen, müssen Sie entweder eine in C geschriebene Python-Erweiterung kompilieren oder die ctypes library verwenden.

So etwas sollte funktionieren, wenn auch bedenken, habe ich nicht getestet:

import ctypes 

# Define necessary structures 
class XINPUT_VIBRATION(ctypes.Structure): 
    _fields_ = [("wLeftMotorSpeed", ctypes.c_ushort), 
       ("wRightMotorSpeed", ctypes.c_ushort)] 

xinput = ctypes.windll.xinput1_1 # Load Xinput.dll 

# Set up function argument types and return type 
XInputSetState = xinput.XInputSetState 
XInputSetState.argtypes = [ctypes.c_uint, ctypes.POINTER(XINPUT_VIBRATION)] 
XInputSetState.restype = ctypes.c_uint 

# Now we're ready to call it. Set left motor to 100%, right motor to 50% 
# for controller 0 
vibration = XINPUT_VIBRATION(65535, 32768) 
XInputSetState(0, ctypes.byref(vibration)) 

# You can also create a helper function like this: 
def set_vibration(controller, left_motor, right_motor): 
    vibration = XINPUT_VIBRATION(int(left_motor * 65535), int(right_motor * 65535)) 
    XInputSetState(controller, ctypes.byref(vibration)) 

# ... and use it like so 
set_vibration(0, 1.0, 0.5) 
+0

Vielen Dank für die Beantwortung, ich bin immer Fehler mit „ctypes.struct“: Es ist kein gültiges Attribut. Ich weiß auch nicht woher "ctypes.struct" kommt! – Belohlavek

+0

@Belohlavek: Whoops, sollte 'Struktur' sein, nicht' struct'. –

+0

Gutes Wochenende Projekt! +1 –

Verwandte Themen