首页 > 解决方案 > 尝试初始化所有可用的操纵杆并将它们的名称放在列表中

问题描述

我一直在尝试制作一个程序来初始化所有可用的操纵杆并将它们的名称放在一个列表中。它给出了以下错误:

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

我认为这是不可能的,因为当没有更多的操纵杆时 for 循环会停止。有人能发现问题吗?提前致谢, 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()

标签: python-3.xpygame

解决方案


问题是代码在列表中有操纵杆,但每次都使用单个元素重新创建列表。因此,当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用于简单的循环迭代器。(有时jk适用于嵌套循环)。这有点重要,因为其他软件引擎将能够更快地读取代码,因为它符合大多数人编写代码的方式。任何都将能够更快地理解他们的代码。但归根结底,这是你的代码,所以你可以随心所欲地编写它。


推荐阅读