Seite 1 von 1
PhotoImage und RuntimeError
Verfasst: Freitag 19. Juni 2009, 19:29
von Pascal
Hallo
ich habe ein Programm in dem diese Zeile auftaucht:
Ich hab festgestellt, dass ich diese Zeile erst einbringen kann, dachdem ich das Fenster erstellt habe.
Ansonsten kommt:
Code: Alles auswählen
Traceback (most recent call last):
File "C:\Python24\tk_test.py", line 7, in <module>
logo=tk.PhotoImage(file='test.gif')
File "C:\Python26\lib\lib-tk\Tkinter.py", line 3285, in __init__
Image.__init__(self, 'photo', name, cnf, master, **kw)
File "C:\Python26\lib\lib-tk\Tkinter.py", line 3226, in __init__
raise RuntimeError, 'Too early to create image'
RuntimeError: Too early to create image
Wenn ich aus dem Programm eine Prozedur mache, so kommt ebenfalls RuntimeError; ohne das ich etwas sonst verändert hätte.
Was muss ich tun, damit alles funktioniert?
Grüße
Pascal
Verfasst: Freitag 19. Juni 2009, 20:16
von wuf
Hallo Pascal
Too early to create image
Das heisst dass die Programmzeile mit:
vor der Zeile mit:
ausgeführt wird. Also Tkinter noch nicht geladen und initialisiert wurde.
Gruss wuf

Verfasst: Freitag 19. Juni 2009, 20:20
von Pascal
wuf hat geschrieben:
Too early to create image
Das heisst dass die Programmzeile mit:
vor der Zeile mit:
ausgeführt wird.
Das habe ich auch so verstanden, aber wenn ich aus dem ganzen Programm eine Prozedur mache, wo
nach der Zeile mit
steht, so kommt ebenfalls genau die gleiche Fehlermeldung!!
Verfasst: Freitag 19. Juni 2009, 20:25
von wuf
Hallo Pascal
Ist es dir möglich diese Prozedur hier ins Forum zu stellen?
Gruss wuf

Verfasst: Freitag 19. Juni 2009, 20:48
von Pascal
Da es sich dabei um ein Projekt für die Schule handelt, würde ich das ganze ungern Forum ins Forum stellen.
Wenn es Dir recht wäre, könnte ich Dir das ganze als Nachricht schreiben...
Wobei natürlich eine Lösung, wenn sie denn gefunden werden sollte, auch gepostet wird. (Das Forum soll ja der Allgemeinheit dienen

)
Verfasst: Freitag 19. Juni 2009, 21:29
von wuf
..... Ja wenn du möchtest kannst du mir deinen Code als Nachricht senden. Sollte ich den Grund für die Exception herausfinden werde ich ihn dem Forum bekanntgeben.
Gruss wuf

Verfasst: Samstag 20. Juni 2009, 00:07
von wuf
Hallo Pascal
Habe dir eine Nachricht gesendet. Wurde bei mir aber nicht als gesendet abgespeichert. Hoffe, dass du meine Nachricht bekommen hast.
Gruss wuf

Verfasst: Samstag 20. Juni 2009, 09:59
von wuf
Hallo Pascal
Bei mir tritt die von dir festgestellte Exception nicht auf. Das PhotoImage-Objekt wird aber auf der Schaltfläche nicht angezeigt. Es ist bekannt, dass ein PhotoImage-Objekt unter Umständen seine Referenz verlieren kann. Folgend einige Snippets welche dies veranschaulichen:
PhotoImage-Objekt in einer Funktion erzeugt
Referenz
geht verloren:
Code: Alles auswählen
# Skriptname: photoimage_problem_01.py (wuf)
import Tkinter as tk
def function():
button_image = tk.PhotoImage(data=TK_SYMBOL)
button = tk.Button(app_win, image=button_image)
button.pack(pady=10)
app_win = tk.Tk()
app_win.geometry("100x40+20+20")
TK_SYMBOL ="""R0lGODlhDgALAID/AP8AAMDAwCH5BAEAAAEALAAA
AAAOAAsAQAIfDI4Qu8pukJmvJtgazppyBkbX8ZChY57ohJmJl6JKAQ
A7GhQAOzu6CkQUAAA7Ow=="""
function()
app_win.mainloop()
PhotoImage-Objekt global und nicht in einer Funktion erzeugt.
Referenz
geht nicht verloren:
Code: Alles auswählen
# Skriptname: photoimage_problem_02.py (wuf)
import Tkinter as tk
def function():
button = tk.Button(app_win, image=button_image)
button.pack(pady=10)
app_win = tk.Tk()
app_win.geometry("100x40+20+20")
TK_SYMBOL ="""R0lGODlhDgALAID/AP8AAMDAwCH5BAEAAAEALAAA
AAAOAAsAQAIfDI4Qu8pukJmvJtgazppyBkbX8ZChY57ohJmJl6JKAQ
A7GhQAOzu6CkQUAAA7Ow=="""
button_image = tk.PhotoImage(data=TK_SYMBOL)
function()
app_win.mainloop()
PhotoImage-Objekt in einer Klasse erzeugt aber nicht an die Klasse gebunden.
Referenz
geht verloren:
Code: Alles auswählen
# Skriptname: photoimage_problem_03.py (wuf)
import Tkinter as tk
class MyClass():
def __init__(self):
button_image = tk.PhotoImage(data=TK_SYMBOL)
button = tk.Button(app_win, image=button_image)
button.pack(pady=10)
app_win = tk.Tk()
app_win.geometry("100x40+20+20")
TK_SYMBOL ="""R0lGODlhDgALAID/AP8AAMDAwCH5BAEAAAEALAAA
AAAOAAsAQAIfDI4Qu8pukJmvJtgazppyBkbX8ZChY57ohJmJl6JKAQ
A7GhQAOzu6CkQUAAA7Ow=="""
my_class = MyClass()
app_win.mainloop()
PhotoImage-Objekt in einer Klasse erzeugt aber mit self an die Klasse gebunden.
Referenz
geht nicht verloren:
Code: Alles auswählen
# Skriptname: photoimage_problem_04.py (wuf)
import Tkinter as tk
class MyClass():
def __init__(self):
self.button_image = tk.PhotoImage(data=TK_SYMBOL)
button = tk.Button(app_win, image=self.button_image)
button.pack(pady=10)
app_win = tk.Tk()
app_win.geometry("100x40+20+20")
TK_SYMBOL ="""R0lGODlhDgALAID/AP8AAMDAwCH5BAEAAAEALAAA
AAAOAAsAQAIfDI4Qu8pukJmvJtgazppyBkbX8ZChY57ohJmJl6JKAQ
A7GhQAOzu6CkQUAAA7Ow=="""
my_class = MyClass()
app_win.mainloop()
Für dieses Phänomen hat BlackJack einmal eine treffende Antwort geschrieben:
http://www.python-forum.de/post-110476.html#110476
Gruss wuf

Verfasst: Samstag 20. Juni 2009, 13:35
von derdon
Darauf wird übrigens auch im Kasten unten auf dieser Seite hingewiesen:
http://effbot.org/tkinterbook/photoimage.htm
Verfasst: Samstag 20. Juni 2009, 21:47
von Pascal
Vielen Dank für deine Hilfe!