2013-06-22 94 views
0

我想在畫布上放置「主」圖像的副本,我從tk.Listbox中選擇哪個名稱。完整的程序代碼是如此之大,所以我把這個部分。畫布上的tkinter圖像消失

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