2013-06-22 8 views
0

Я хочу поместить копии «основного» изображения, которое я выбираю из tk.Listbox на холсте. Полный программный код настолько велик, что его можно разместить здесь, поэтому я поместил части этого.tkinter images на холсте исчезает

from PIL import Image, ImageTk 
import Tkinter as tk 
import dircache 
import copy 

def callback(event): 
    label.master_image=ImageTk.PhotoImage(Image.open(path)) 
    label.configure(image=label.master_image) 


def apply(): 
    canvas.copy_image=copy.copy(label.master_image) 
    canvas.create_image(10,10,canvas.copy_image) 


root=tk.Tk() 

frame=tk.Frame(master=root) 
canvas=tk.Canvas(master=frame) 

listbox=tk.Listbox(master=frame) 
listbox.insert(tk.END, *dircache.listdir('./images')) 
listbox.bind('<ButtonRelease-1>', callback) 

label=tk.Label(master=frame) 

button=tk.Button(master=frame, text='Apply', command=apply) 

canvas.pack() 
frame.pack() 
listbox.pack() 
label.pack() 
button.pack() 

root.mainloop() 

Но когда я просто нажмите на другой пункт меню (не на кнопку «Применить»), что означает, что label.master_image изменения, изображение на холсте исчезает.

P.S. label.master_image используется для предварительного просмотра на этикетке, прежде чем применять изменения на холсте.

ответ

2

Продолжайте ссылаться на изображение. copy.copy не требуется.

canvas.copy_image = label.master_image

from PIL import Image, ImageTk 
import Tkinter as tk 
import os 

def callback(event): 
    idx, = listbox.curselection() 
    path = os.path.join('images', listbox.get(idx)) 
    label.master_image=ImageTk.PhotoImage(Image.open(path)) 
    label.configure(image=label.master_image) 


def apply(): 
    canvas.copy_image = label.master_image 
    canvas.create_image(10,10, image=canvas.copy_image) 


root=tk.Tk() 

frame=tk.Frame(master=root) 
canvas=tk.Canvas(master=frame) 

listbox=tk.Listbox(master=frame) 
listbox.insert(tk.END, *os.listdir('images')) 
listbox.bind('<ButtonRelease-1>', callback) 

label=tk.Label(master=frame) 

button=tk.Button(master=frame, text='Apply', command=apply) 

canvas.pack() 
frame.pack() 
listbox.pack() 
label.pack() 
button.pack() 

root.mainloop() 
+0

С или без copy.copy моей версии кода не работает – EgorPuzyrev

+0

вы ли попробовать мой код? – falsetru

+0

Да, спасибо, это работает, но я не вижу такой глобальной разницы между ними. – EgorPuzyrev

Смежные вопросы