PhotoImage und RuntimeError

Fragen zu Tkinter.
Antworten
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

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
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

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!!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Pascal

Ist es dir möglich diese Prozedur hier ins Forum zu stellen?

Gruss wuf :wink:
Take it easy Mates!
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

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: )
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

..... 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:
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Darauf wird übrigens auch im Kasten unten auf dieser Seite hingewiesen: http://effbot.org/tkinterbook/photoimage.htm
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

Vielen Dank für deine Hilfe!
Antworten