[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