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:

Code: Alles auswählen

logo=tk.PhotoImage(file='test.gif')
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:

Code: Alles auswählen

logo=tk.PhotoImage(file='test.gif')
vor der Zeile mit:

Code: Alles auswählen

root = tk.Tk()
ausgeführt wird. Also Tkinter noch nicht geladen und initialisiert wurde.

Gruss wuf :wink:

Verfasst: Freitag 19. Juni 2009, 20:20
von Pascal
wuf hat geschrieben:
Too early to create image
Das heisst dass die Programmzeile mit:

Code: Alles auswählen

logo=tk.PhotoImage(file='test.gif')
vor der Zeile mit:

Code: Alles auswählen

root = tk.Tk()
ausgeführt wird.
Das habe ich auch so verstanden, aber wenn ich aus dem ganzen Programm eine Prozedur mache, wo

Code: Alles auswählen

logo=tk.PhotoImage(file='test.gif')
nach der Zeile mit

Code: Alles auswählen

root = tk.Tk()
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 :wink:

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 :wink: )

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 :wink:

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 :wink:

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 :wink:

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!