【问题标题】:(IndexError: list index out of range) My for loop is giving me an error?(IndexError: list index out of range) 我的 for 循环给了我一个错误?
【发布时间】:2014-08-21 03:01:20
【问题描述】:

这是我的代码:

import game, pygame, sys
from gameobjects import *
from imageloader import *




def main():
    screen = pygame.display.set_mode( (800, 600) )
    background = Background("images/Nebula1.bmp", screen.get_width(), screen.get_height())
    letter1 = pygame.image.load("1.bmp")
    letter2 = pygame.image.load("2.bmp")
    letter3 = pygame.image.load("3.bmp")
    letter4 = pygame.image.load("4.bmp")
    letter5 = pygame.image.load("5.bmp")
    letter6 = pygame.image.load("6.bmp")
    letter7 = pygame.image.load("7.bmp")
    letter8 = pygame.image.load("8.bmp")
    letter9 = pygame.image.load("9.bmp")
    letter10 = pygame.image.load("10.bmp")
    Letters = [letter1, letter2, letter3, letter4, letter5, letter6, letter7, letter8, letter9, letter10]
    letter = 0

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()

        screen.blit(background.image, (0,0))

        for i in Letters:
            screen.blit( Letters[letter], (330 + 14 * letter, 190) )
            letter += 1


        pygame.display.flip()
All the items in the Letters list are pygame.Surfaces retrieved through using pygame.image.load(). Every time I run this code, I get an error that looks like this:

    Traceback (most recent call last):
      File "main.py", line 75, in <module>
        main()
      File "main.py", line 32, in main
        screen.blit( Letters[letter], ((330 + 14 * letter, 190)) )
    IndexError: list index out of range

为什么会这样?这对我来说似乎完全有效。我究竟做错了什么?我想要做的是将屏幕上的每个字母粘贴到上一个 14 像素的位置,因为每个字母都是 14 像素宽。有什么帮助吗? (我是python新手,所以如果我犯了一个愚蠢的错误,请原谅我。)

【问题讨论】:

    标签: python for-loop pygame traceback


    【解决方案1】:

    您必须为每次迭代设置letter = 0。因为它在 while 循环之外,所以 letter 仅在初始化时设置为 0。之后它在for i in letters 的第二次迭代中抛出IndexError,因为letter 现在等于letters 的长度,因为最后一次迭代!

    使用enumerate() 确保安全并轻松增加:

    for i,val in enumerate(Letters):
            screen.blit( Letters[i], (330 + 14 * letter, 190) )
    

    或者,在 while 循环中包含 letter = 0

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
    
        screen.blit(background.image, (0,0))
    
        letter = 0
        for i in Letters:
            screen.blit( Letters[i], (330 + 14 * letter, 190) )
            letter += 1
    

    【讨论】:

    • 它运行了,但我遇到了另一个问题。当我运行它时,字母并没有真正打印到屏幕上,它们只是很快滑过它......你知道为什么会发生这种情况吗?
    • 我不太清楚你的意思。由于这是两个不同的问题,你应该问另一个关于新问题的问题。如果我的回答解决了你的第一个问题,你能接受我的回答吗?
    • 我的意思是 for 循环没有做它应该做的事情,这就是我想要的答案。这就是问题所在,因为我仍然有一个错误,只是不是同样的错误。
    • 问题中的错误for 循环在哪里?请不要编辑错误,任何人应该如何理解这个答案正在修复什么?
    • 哦,对不起,我添加了其余的代码,我会改回错误。它在复制粘贴中。
    猜你喜欢
    • 2022-06-14
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多