Domanda

sto notando un bel strano bug con Tkinter, e mi chiedo se è perché c'è qualcosa nel modo in cui il pitone interagisce con il TCL, almeno in Win32.

Qui ho una super semplice programma che visualizza un'immagine GIF. Funziona perfettamente.

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( )

Ora, a cambiare il programma un po 'per modificare l'oggetto di tela all'interno di una funzione. Questa volta, ho appena ottenere una tela bianca.

# 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( )

L'unica differenza tra i due è che in un oggetto tela viene passato a una funzione invece di essere utilizzato direttamente. Entrambe le dichiarazioni di stampa restituiscono risultati identici. Mi chiedo se non c'è forse qualche guasto nel modello a oggetti a livello di TCL / python.

Ogni pensiero, gente?

Grazie, / YGA

È stato utile?

Soluzione

fare che come una soluzione rapida, e cercherò di spiegare:

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

A PhotoImage deve avere almeno un riferimento da qualsiasi oggetto Python, altrimenti è garbage collection. Nella mia soluzione, vi suggerisco di fare photo essere un nome a livello di modulo, in modo che quando la funzione termina, ci sarà ancora un riferimento all'oggetto PhotoImage. Si potrebbe preferire di creare una classe e fare set_canvas in un metodo, e memorizzare l'oggetto PhotoImage come una variabile di istanza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top