Gibt es eine bekannte Win32 Tkinter Fehler in Bezug auf Fotos auf einer Leinwand angezeigt wird?

StackOverflow https://stackoverflow.com/questions/576843

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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top