Попытка инициализировать все доступные джойстики и поместить их имена в список - PullRequest
1 голос
/ 20 января 2020

Я пытался создать программу, которая инициализирует все доступные джойстики и помещает их имена в список. Это дает следующую ошибку:

joysticks[x].init()
IndexError: list index out of range

Я думал, что это было бы невозможно, поскольку for-l oop останавливается, когда джойстиков больше нет. Может кто-то определить проблему? Заранее спасибо, Adutchman

import pygame,sys
#pygame.display.set_mode((1, 1))
from tkinter import *

window = Tk()
window.title("Ets2 Button Admin")
window.geometry('500x300')

pygame.joystick.init()
pygame.display.init()
#Initialises pygame
j_name =[]
def controlcheck():
    count = pygame.joystick.get_count()
    if count == 0:
        lbl = Label(window, text="There is no controller connected to the PC, please connect a controller")
        lbl.grid(column=0, row=0)

    elif count > 0:
        lbl = Label(window, text="Connected controllers:")
        lbl.grid(column=0, row=0)
        for x in range(count):
            joysticks = [pygame.joystick.Joystick(x)]
            joysticks[x].init()
            j_name = [joysticks[x].get_name()]
        lbl = Label(window, text=f"{j_name}")
        lbl.grid(column=0, row=1)
    window.after(500,controlcheck)
controlcheck()
window.mainloop()

1 Ответ

0 голосов
/ 21 января 2020

Проблема в том, что код имеет джойстик в списке, но каждый раз, когда список создается заново с одним элементом. Поэтому, когда x равно нулю, все в порядке. Но на второй итерации joysticks - это всего лишь список из 1 элемента, но код запрашивает второй элемент (потому что x == 1).

    for x in range(count):
        joysticks = [pygame.joystick.Joystick(x)]
        joysticks[x].init()

Полагаю, вы хотели создать список джойстиков:

    joysticks = []
    for i in range( count ):
        joysticks.append( pygame.joystick.Joystick( i ) )
        joysticks[i].init()

Вы могли бы также использовать joysticks[-1].init(), чтобы всегда получать последний элемент, но это не выделило бы эту ошибку.

Примечание о стиле: обычно соглашение использовать переменную i для простого итератора l oop. (Иногда j и k тоже для вложенных циклов). Это несколько важно, потому что другие программные движки смогут быстрее читать код, потому что это соответствует тому, как большинство людей пишут код. Любой вы смогут более быстро понять свой код. Но в конечном итоге это ваш код, поэтому пишите его так, как вам нравится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...