Images auf Tk Buttons geht schief

Fragen zu Tkinter.
Antworten
jocsch
User
Beiträge: 31
Registriert: Freitag 4. April 2003, 13:09
Wohnort: Egloffstein (Hundshaupten)

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,
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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
jocsch
User
Beiträge: 31
Registriert: Freitag 4. April 2003, 13:09
Wohnort: Egloffstein (Hundshaupten)

Das war die Lösung! Danke schön!!!
jocsch
User
Beiträge: 31
Registriert: Freitag 4. April 2003, 13:09
Wohnort: Egloffstein (Hundshaupten)

... 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
Antworten