如何使按钮命令在 tkinter 中打开 window 内的图像?

How to make button command to open image inside window in tkinter?

我正在尝试在 tkinter 中创建一个非常简单的图像查看器,其中包含两个简单的查看和关闭按钮。我的关闭按钮按预期运行,但我无法让我的查看按钮打开我的文件目录中的指定图像。我试过导入 ImageTK 来写一个按钮命令来打开它,但到目前为止还没有成功。

import tkinter as tk
from PIL import ImageTk,Image

class image_viewer:
    def __init__(self, win):  
        
        self.root = win
        
        
        self.root.title('ImageViewer')
        self.root.geometry('400x350')

        
        self.btnView = tk.Button(text='View', command= ImageTk.PhotoImage(Image.open(r"C:\Users\SteveSmith\eclipse-workspace\SteveSmith-ex1\src\raw\pythonIsFun.jpg")))
        self.btnView.pack(side=tk.LEFT)
        self.btnView.place(x=20, y=265)
        
        self.btnClose = tk.Button(text='close', command=self.root.destroy)
        self.btnClose.pack(side=tk.LEFT)
        self.btnClose.place(x=65, y=265)

def main():
    root = tk.Tk()
    image_viewer(root)
    root.mainloop()

if __name__ == '__main__':
    main()

您的代码中有许多错误,之前我在选择其中一个错误并将其标记为另一个问题的副本后将其关闭,该问题在解决该问题之前已被询问和回答。

但是,根据您发表的评论并经过深思熟虑,我决定重新打开它并尝试解决我看到的所有或至少大部分问题 — 否则您可能要花很长时间才能搞定一切都已修复。

结果如下:

from PIL import ImageTk, Image
import tkinter as tk

class ImageViewer:
    def __init__(self, root, image_filename):
        self.root = root
        self.image_filename = image_filename

        self.root.title('ImageViewer')
        self.root.geometry('400x350')

        self.canvas = tk.Canvas(self.root, width=300, height=300)
        self.canvas.place(x=10, y=10)

        self.btnView = tk.Button(text='View', command=self.view_image)
        self.btnView.place(x=20, y=265)

        self.btnClose = tk.Button(text='close', command=self.root.destroy)
        self.btnClose.place(x=65, y=265)

    def view_image(self):
        self.img = ImageTk.PhotoImage(Image.open(self.image_filename))  # Keep ref to image.
        self.canvas.create_image(20, 20, anchor=tk.NW, image=self.img)


def main(image_filename):
    root = tk.Tk()
    ImageViewer(root, image_filename)
    root.mainloop()

if __name__ == '__main__':
    main(r"C:\Users\SteveSmith\eclipse-workspace\SteveSmith-ex1\src\raw\pythonIsFun.jpg")