Seite 1 von 1

Images auf Tk Buttons geht schief

Verfasst: Freitag 26. März 2004, 12:16
von jocsch
Hallo Forum!
Ich versuche mit folgendem Code ein Bildchen auf ein Button-Widget zu bekommen:

Code: Alles auswählen

#!/usr/bin/python
from Tkinter import *
import Image

def spam():
	print 'pressed me!'

root = Tk()
im = Image.open('Select.jpg')
print im.size, im.mode
test = Button(root, image = im, command = spam)
test.pack()
root.mainloop()


... und kriege folgende Ausgabe:

(32, 32) L
Traceback (most recent call last):
File "buttontest.py", line 11, in ?
test = Button(root, image = im, command = spam)
File "/usr/lib/python2.3/lib-tk/Tkinter.py", line 1906, in __init__
Widget.__init__(self, master, 'button', cnf, kw)
File "/usr/lib/python2.3/lib-tk/Tkinter.py", line 1835, in __init__
self.tk.call(
_tkinter.TclError: image "<JpegImagePlugin.JpegImageFile instance at 0x408a490c>" doesn't exist

Weiss jemand Rat?
(Python 2.3, Suse Linux 9.0)

Wie immer heissen Dank im Voraus,

Verfasst: Freitag 26. März 2004, 16:01
von Milan
Hi. Auf Buttons können immer nur Instanzen der Klasse PhotoImage/BitmapImage kleben... die Python mit Tkinter on Board hat kann nur gif's laden, also musst du die aus der PIL verwenden:

Code: Alles auswählen

#!/usr/bin/python 
from Tkinter import * 
import Image, ImageTk

def spam(): 
   print 'pressed me!' 

root = Tk() 
im = Image.open('Select.jpg') 
print im.size, im.mode 
im2 = ImageTk.PhotoImage(im)
test = Button(root, image = im2, command = spam) 
test.pack() 
root.mainloop()
im2 kannst du natürlich auch gleich durch ImageTk.PhotoImage(file='Select.jpg') erzeugen.

hth,
Milan

Verfasst: Dienstag 6. April 2004, 13:12
von jocsch
Das war die Lösung! Danke schön!!!

Verfasst: Sonntag 11. April 2004, 22:35
von jocsch
... und überhaupt darf die Variable, welche das Bild enthält (z.B. im = Image.open(...)) nicht der Garbagecollection zum Opfer fallen, also global machen oder als Eigenschaft der Klasse (self.im = Image.open(...)).

Vielen Dank nochmal an Milan, jocsch