[Tutor] Tkinter pass-by-reference query

Henry Finucane h.finucane at gmail.com
Sat May 20 02:42:25 CEST 2006


While attempting to add images to a canvas programmatically, I wrote
the following:
for i in os.listdir('./icons/terrain'):
	self.terrainScreen["height"] = str(int(self.terrainScreen["height"])+50)
	debug(self.terrainScreen["height"]+" height of terrainScreen",5)
	img = PhotoImage(file='./icons/terrain/'+i)
	self.terrainScreen.create_image(int(self.terrainScreen["height"])-50,(int(self.terrainScreen["height"])-50),
image=img,tag=None)

I couldn't figure out why it didn't work, until I went in and played
with Tkinter in the python shell, and I came to the conclusion that
the reason nothing was displayed on the canvas was that images are
passed by reference. In other words, unless there is a permanent `img'
variable, the data disappears.

For example (replace w\ your own gifs):
>>> from Tkinter import *
>>> root = Tk()
>>> terrain = Canvas(root,width=50,height=50)
>>> img = PhotoImage(file='MapEditor/icons/terrain/desert.gif')
>>> terrain.create_image(0,0,image=img)
1
>>> terrain.pack()

Works beautifully, eh?

>>> img = PhotoImage(file='MapEditor/icons/terrain/water.gif')

Doh! Now it disappears!

>>> terrain.create_image(0,50,image=img)
2

Working, but there is only one image

>>> terrain.create_image(0,0,image=PhotoImage('MapEditor/icons/terrain/grass.gif'))
3

Nothing gets displayed.

So there is my problem, and what is, I'm fairly certain, the cause of
the problem. Unfortunately, I really have no idea what the proper
solution should be. I'd like to populate the canvas programmatically,
but my brain seems to be choking on possible solutions. Suggestions?
Can I force variables to be passed by value?

-- 
--H.F.
My penguin is bigger than yours, mister...


More information about the Tutor mailing list