简体   繁体   中英

Tkinter error - Tuple index out of range

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!

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM