Gibt es eine bekannte Win32 Tkinter Fehler in Bezug auf Fotos auf einer Leinwand angezeigt wird?
-
05-09-2019 - |
Frage
Ich bemerken einen ziemlich seltsamen Fehler mit tkinter, und ich frage mich, ob es ist, weil es etwas ist, wie der Python interagiert mit dem tcl, zumindest in Win32.
Hier habe ich ein Super einfaches Programm, das ein GIF-Bild zeigt. Es funktioniert perfekt.
from Tkinter import *
canvas = Canvas(width=300, height=300, bg='white')
canvas.pack()
photo=PhotoImage(file=sys.argv[1])
canvas.create_image(0, 0, image=photo, anchor=NW) # embed a photo
print canvas
print photo
mainloop( )
Nun, ich das Programm ändern leicht die Leinwand Objekt innerhalb einer Funktion zu bearbeiten. Diesmal habe ich nur eine leere Leinwand bekommen.
# demo all basic canvas interfaces
from Tkinter import *
canvas = Canvas(width=300, height=300, bg='white')
canvas.pack()
def set_canvas(cv):
photo=PhotoImage(file=sys.argv[1])
cv.create_image(0, 0, image=photo, anchor=NW) # embed a photo
print cv
print photo
set_canvas(canvas)
mainloop( )
Der einzige Unterschied zwischen den beiden ist, dass die Leinwand Objekt in einer an eine Funktion übergeben wird, anstatt direkt verwendet wird. Beide Druck Anweisungen geben identische Ergebnisse. Ich frage mich, ob es vielleicht einiger Zusammenbruch im Objektmodell auf der Tcl / Python Schicht ist.
Alle Gedanken, Leute?
Danke, / YGA
Lösung
Sie, dass als eine schnelle Lösung, und ich werde versuchen zu erklären:
def set_canvas(cv):
global photo # here!
photo=PhotoImage(file=sys.argv[1])
cv.create_image(0, 0, image=photo, anchor=NW) # embed a photo
print cv
print photo
Ein Photobild benötigt mindestens eine Referenz von jedem Python-Objekt haben, sonst ist es Müll gesammelt. In meiner Lösung, schlage ich photo
ein Modul-Level-Name zu machen, also, wenn die Funktion beendet ist, wird es noch ein Verweis auf das Photobild-Objekt sein. Sie könnten es vorziehen, um eine Klasse zu erstellen und set_canvas
in ein Verfahren zu machen, und speichern Sie das Photobild Objekt als Instanzvariable.