Why would I index an IndexError: list index out of range. When the index of a list cannot be out of range?
I am creating a dice game, and when I got to the part where I assign images to each Tkinter label so that the dice are displayed, I started getting this error:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1486, in __call__
return self.func(*args)
File "C:/Users/Logan/Desktop/Dice/dicelab2.py", line 56, in rollDice
self.dice[i].roll()
File "C:/Users/Logan/Desktop/Dice/dicelab2.py", line 35, in roll
self.display.config(image=Photolist[self.value-1])
IndexError: list index out of range
Now the list contains 6 entries, and I call it from myself. cost. Self.value is assumed to be a random integer from 1 to 6. Before I name it, I subtract 1 so that it is in the Photolist index. What else could be causing this error? Here's my code:
import Tkinter
import random
Photolist=[]
class Die:
def __init__(self,frame):
self.value = random.randint(1,6)
print self.value
photo1=Tkinter.PhotoImage(file="1.gif")
photo2=Tkinter.PhotoImage(file="2.gif")
photo3=Tkinter.PhotoImage(file="3.gif")
photo4=Tkinter.PhotoImage(file="4.gif")
photo5=Tkinter.PhotoImage(file="5.gif")
photo6=Tkinter.PhotoImage(file="6.gif")
Photolist=[photo1,photo2,photo3,photo4,photo5,photo6]
self.display = Tkinter.Label(frame,
image=Photolist[self.value-1],
font=('Courier New',30),
relief='ridge',
borderwidth=5,
bg='white')
self.display.pack(side='left')
def roll(self):
self.value = random.randint(1,6)
print self.value
self.display.config(image=Photolist[self.value-1])
class DiceRoller:
def __init__(self):
gameWin = Tkinter.Tk()
gameWin.title('Dice Roller')
diceFrame = Tkinter.Frame(gameWin)
self.dice = [ ]
for i in range(5):
self.dice.append(Die(diceFrame))
rollBtn = Tkinter.Button(gameWin,
text='Roll Again',
command=self.rollDice,
font=('Courier New',30))
diceFrame.pack()
rollBtn.pack(side='bottom')
gameWin.mainloop()
def rollDice(self):
for i in range(5):
self.dice[i].roll()
dice = DiceRoller()
dice
+3
source to share
1 answer
import Tkinter
import random
# PhotoList = [] you are accessing this
class Die(object):
def __init__(self,frame):
self.value = random.randint(1,6)
print self.value
photo1=Tkinter.PhotoImage(file="1.gif")
photo2=Tkinter.PhotoImage(file="2.gif")
photo3=Tkinter.PhotoImage(file="3.gif")
photo4=Tkinter.PhotoImage(file="4.gif")
photo5=Tkinter.PhotoImage(file="5.gif")
photo6=Tkinter.PhotoImage(file="6.gif")
# make it an attribute
self.Photolist=[photo1,photo2,photo3,photo4,photo5,photo6]
self.display = Tkinter.Label(frame,
image=self.Photolist[self.value-1],
font=('Courier New',30),
relief='ridge',
borderwidth=5,
bg='white')
self.display.pack(side='left')
def roll(self):
self.value = random.randint(1,6)
print self.value
self.display.config(image=self.Photolist[self.value-1])
In your code you had Photolist = []
, so you were trying to access this empty, not inside your class, I changed it as an attribute, so you shouldn't have any problems now.
+2
source to share