Pergunta

Eu estou percebendo um bug muito estranho com tkinter, e eu estou querendo saber se é porque há algo na forma como as interage python com o tcl, pelo menos em Win32.

Aqui eu tenho um que exibe uma imagem GIF programa super simples. Ele funciona perfeitamente.

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

Agora, eu alterar o programa ligeiramente para editar o objeto da lona de dentro de uma função. Desta vez, eu só pegar uma tela em branco.

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

A única diferença entre os dois é que em um o objecto da lona é passado para uma função, em vez de ser utilizado directamente. Ambas as declarações de impressão retornar resultados idênticos. Eu estou querendo saber se há talvez alguma ruptura no modelo de objeto no tcl / python camada.

Todos os pensamentos, gente?

Obrigado, / YGA

Foi útil?

Solução

Do que como uma solução rápida, e eu vou tentar explicar:

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 precisa ter pelo menos uma referência de qualquer objeto Python, caso contrário é lixo coletado. Na minha solução, sugiro fazer photo ser um nome de nível de módulo, por isso, quando as extremidades de função, haverá ainda uma referência ao objeto PhotoImage. Você pode preferir criar uma classe e fazer set_canvas em um método, e armazene o objeto PhotoImage como uma variável de instância.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top