0

我想在画布上放置我从 tk.Listbox 中选择的名称的“主”图像的副本。完整的程序代码太大了,放在这里,所以我放了其中的一部分。

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改变,画布上的图像消失了。

PSlabel.master_image用于在画布上应用更改之前在标签上预览它。

4

1 回答 1

2

Keep reference to the image. copy.copy is not necessary.

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()
于 2013-06-22T03:52:36.247 回答