Tkinter 将仅显示我 select 通过 filedialog.askopenfilename 的第一张照片

Tkinter will only display the first photo I select via filedialog.askopenfilename

我有一个程序允许用户从他们的 PC select 图像然后显示它。问题是它只能工作一次。第一张照片已显示,但如果我 select/open 另一张照片,我认为这张照片会出现在原始照片之上,但事实并非如此。

知道为什么吗?

root = tk.Tk()
root.geometry("500x500")
root.title('Color Comparer')
picture_chooser_btn = tk.Button(master=root, text='Select Image', command= lambda: open_image())
picture_chooser_btn.pack()
base_color_picker_btn = tk.Button(master=root, text='Choose Base Color', command= lambda: selectBaseColor())
base_color_picker_btn.pack()
canvas = Canvas(root, width=80, height=50, bg="#F8F9F9")

base_color_rect = canvas.create_rectangle(0, 0, 85, 85, fill="red")
canvas_label = canvas.create_text((42, 20), text="Base Color")

canvas.pack()
label = tk.Label(root, anchor="w")
label.pack(side="top", fill="x") 
root.bind('<ButtonPress-1>', on_click)

root.mainloop()

用于从PC抓取照片的功能:

def open_image():
    global image_selected
    path=filedialog.askopenfilename(filetypes=[("Image File",'.jpg .png .jpeg')])
    im = Image.open(path)
    im = im.resize((400, 400), Image.ANTIALIAS)
    tkimage = ImageTk.PhotoImage(im)
    myvar=Label(root,image = tkimage)
    myvar.image = tkimage
    myvar.pack()
    myvar.lift()
    label.configure(text="you selected an image")
    print("you selected an image")
    print(str(tkimage))
    image_selected = True

在显示新图像之前,您需要先销毁包含上一张图像的旧标签小部件。

我对您的函数做了一些小的修改,使代码可以按照您描述的方式工作

myvar = None

def open_image():
    global myvar
    if myvar is not None:
        myvar.destroy()
    path=filedialog.askopenfilename(filetypes=[("Image File",'.jpg .png .jpeg')])
    im = Image.open(path)
    im = im.resize((400, 400), Image.ANTIALIAS)
    tkimage = ImageTk.PhotoImage(im)
    myvar=Label(root,image = tkimage)
    myvar.image = tkimage
    myvar.pack()
    myvar.lift()
    label.configure(text="you selected an image")
    print("you selected an image")
    print(str(tkimage))