Python Forum

Full Version: Using joystick module from PyGame
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Exact code with commenting can be found here, or here.

while done==False:
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        done=True

    if event.type == pygame.JOYBUTTONDOWN:
        print("Joystick button pressed.")
    if event.type == pygame.JOYBUTTONUP:
        print("Joystick button released.")

screen.fill(darkgrey)
textPrint.reset()

joystick_count = pygame.joystick.get_count()

textPrint.print(screen, "Number of joysticks: {}".format(joystick_count) )
textPrint.indent()

for i in range(joystick_count):
    joystick = pygame.joystick.Joystick(i)
    joystick.init()

    textPrint.print(screen, "Joystick {}".format(i) )
    textPrint.indent()

    name = joystick.get_name()
    textPrint.print(screen, "Joystick name: {}".format(name) )

    axes = joystick.get_numaxes()
    textPrint.print(screen, "Number of axes: {}".format(axes) )
    textPrint.indent()

    for i in range( axes ):
        axis = joystick.get_axis( i )
        textPrint.print(screen, "Axis {} value: {:>6.0f}".format(i, axis) )
    textPrint.unindent()

    buttons = joystick.get_numbuttons()
    textPrint.print(screen, "Number of buttons: {}".format(buttons) )
    textPrint.indent()

    for i in range( buttons ):
        button = joystick.get_button( i )
        textPrint.print(screen, "Button {:>2} value: {}".format(i,button) )
    textPrint.unindent()

    hats = joystick.get_numhats()
    textPrint.print(screen, "Number of hats: {}".format(hats) )
    textPrint.indent()

    for i in range( hats ):
        hat = joystick.get_hat( i )
        textPrint.print(screen, "Hat {} value: {}".format(i, str(hat)) )
    textPrint.unindent()

pygame.display.flip()
clock.tick(20)
With the help of the online PyGame documentation, I was able to produce a screen displaying values for individual Joysticks. Sadly, I'm unsure on how I could translate these values to an event that produces something like, "this button is pressed, now do this".
not a pygame expert, but it appears that in the code:
    if event.type == pygame.JOYBUTTONDOWN:
        print("Joystick button pressed.")
    if event.type == pygame.JOYBUTTONUP:
        print("Joystick button released.")
instead of just printing, call a function, for example:
    if event.type == pygame.JOYBUTTONDOWN:
        process_button_down_stuff()
    if event.type == pygame.JOYBUTTONUP:
        process_button_up_stuff()
(Sep-22-2018, 08:16 PM)Larz60+ Wrote: [ -> ]not a pygame expert, but it appears that in the code:
    if event.type == pygame.JOYBUTTONDOWN:
        print("Joystick button pressed.")
    if event.type == pygame.JOYBUTTONUP:
        print("Joystick button released.")
instead of just printing, call a function, for example:
    if event.type == pygame.JOYBUTTONDOWN:
        process_button_down_stuff()
    if event.type == pygame.JOYBUTTONUP:
        process_button_up_stuff()

Hi Larz,
Thanks for the reply. What you have suggested would work, but isn’t specific to the pos and neg values. Is there a way, maybe here,
axes = joystick.get_numaxes()
        textPrint.print(screen, "Number of axes: {}".format(axes) )
        textPrint.indent()
Where I could say “If joystick no.1’s axis no.3 is 1, then print ‘hello!’”?

Cheers.
Something similar to this,
for i in range( axes ):
    axis = joystick.get_axis( i )
    textPrint.print(screen, "Axis {} value: {:>6.0f}".format(i, axis) )

    if Joystick 2's Axis 3 is equal to 1:
        print("Joystick 2 is pointing to the right.")

    if Joystick 2's Axis 3 is equal to -1:
        print("Joystick 2 is pointing to the left.")

textPrint.unindent()
I'd have to have a setup that I could try to say definitively what would and wouldn't work. Some of the moderators here use pygame and will respond sooner or later. metulburr for one.
Joystick event example.
import pygame
pygame.init()

def main():
    pygame.display.set_caption('JoyStick Example')
    surface = pygame.display.set_mode((800, 600))
    clock = pygame.time.Clock()
    running = True

    font = pygame.font.Font(None, 20)
    linesize = font.get_linesize()
    joysticks = [pygame.joystick.Joystick(i) for i in range(pygame.joystick.get_count())]
    for joy in joysticks:
        joy.init()

    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.JOYAXISMOTION:
                print(event)
            elif event.type == pygame.JOYHATMOTION:
                print(event)
            elif event.type == pygame.JOYBUTTONDOWN:
                print(event)

        surface.fill((0,0,0))


        pygame.display.flip()
        clock.tick(20)

    pygame.quit()

main()
joystick states example.
import pygame
pygame.init()

def main():
    pygame.display.set_caption('JoyStick Example')
    surface = pygame.display.set_mode((800, 600))
    clock = pygame.time.Clock()
    running = True

    font = pygame.font.Font(None, 20)
    linesize = font.get_linesize()
    joysticks = [pygame.joystick.Joystick(i) for i in range(pygame.joystick.get_count())]
    print(len(joysticks))
    for joy in joysticks:
        joy.init()

    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        surface.fill((0,0,0))

        # joystick buttons
        for j in range(len(joysticks)):
            for i in range(joysticks[j].get_numbuttons()):
                if joysticks[j].get_button(i):
                    print("Joystick {}, Button {} pressed".format(j, i))

        pygame.display.flip()
        clock.tick(20)

    pygame.quit()

main()
I'm unsure on how to mark this post as solved, but I managed to work out a solution.