Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Tkinter error - Tuple index out of range

Tags:

python

tkinter

This program is supposed to put a sprite on the canvas for the user to control using the left and right arrow keys, but I keep getting a Tuple index out of range error, and I do not have any tuples in my program. I know that I properly imported the picture, so its probably something to do with the key pressing event.

#4/22/15
#Test game, user controlled sprite
import random
from Tkinter import *
import Tkinter
from PIL import Image, ImageTk

root = Tk()
root.geometry('700x600')

canvas = Canvas(root,width=700,height=600,bg='white')
canvas.place(x=0,y=0)

class Character_sprite(object):
    '''Creates the users sprite and handles the events'''
    def __init__(self):
        self.im = Image.open('grey_mario_mushroom_sprite.png')
        self.tkimage = ImageTk.PhotoImage(self.im)
        self.char_sprite = canvas.create_image(image=self.tkimage)

    def moveLeft(event):
        '''Handles the left arrow key press event, moves char_sprite to the left'''
        canvas.move(self.char_sprite,-20,0)
        canvas.update()
    def moveRight(event):
        '''Handles the right arrow key press event, moves the char_sprite to the right'''
        canvas.move(self.char_sprite,20,0)
        canvas.update()


root.bind('<Left>', Character_sprite.moveLeft)
root.bind('<Right>', Character_sprite.moveRight)
Character_sprite()
root.mainloop()

This is the error:

Traceback (most recent call last):
  File "C:\Users\Calvin\Documents\Python Programs\Test_game_example.py", line 57, in <module>
    Character_sprite()
  File "C:\Users\Calvin\Documents\Python Programs\Test_game_example.py", line 36, in __init__
    self.char_sprite = canvas.create_image(image=self.tkimage)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 2310, in create_image
    return self._create('image', args, kw)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 2294, in _create
    cnf = args[-1]
IndexError: tuple index out of range

Please help!

like image 546
Hobbs2000 Avatar asked Mar 17 '23 07:03

Hobbs2000


1 Answers

The problem is that create_image requires a position. Like this:

self.char_sprite = canvas.create_image((0, 0), image=self.tkimage)

If Tkinter had been defined in a more friendly way, you'd get a friendlier error message:

>>> def create_image(position, **options):
...     pass
>>> create_image(image=0)
TypeError: create_image() takes exactly 1 argument (0 given)

Unfortunately, Tkinter is often a bit complicated under the covers, so it's defined more like this:

>>> def create_image(*args, **options):
...     position = args[-1]
...     pass

So, you get a less useful error message. The *args ends up as an empty tuple, so that position = args[-1] raises an IndexError. And of course the variable isn't even called position, but cnf, which doesn't help you understand the problem.

But it's the same problem. You forgot to pass the position argument.

like image 168
abarnert Avatar answered Mar 28 '23 21:03

abarnert