如何显示通过文件对话框选择的图像(在画布上)?

时间:2018-12-23 23:00:59

标签: python tkinter python-imaging-library tkinter-canvas

几天前我开始了一个项目,但不幸的是我被困住了。我想制作一个图像编辑器(一个非常简单的; D),在其中可以通过使用filedialog选择一个图像,然后我可以进行一些修改,例如旋转。我的问题是我可以选择图像,但是一旦选择,就无法在画布上显示图像。

它说:“名称'image'未定义”

我认为我的问题是该程序希望在画布上显示图像,但我尚未选择它。

from tkinter import *
from PIL import Image, ImageTk
from tkinter import filedialog

root = Tk()

#function to select my image by using the filedialog
def select_image(): 
    file_path = filedialog.askopenfilename()
    image = Image.open(file_path)

#button to press to open filedialog
select = Button(root, text="select an image", command=select_image)
select.pack()

#the canvas where the image will be display
canvas = Canvas(root, width= 100, height=100, bg="grey")
canvas.pack()

image_tk = ImageTk.PhotoImage(image)
canvas.create_image(0,0, image= image_tk)


root.mainloop()

2 个答案:

答案 0 :(得分:0)

可以在要显示图像文件之前创建一个图像对象,但是这样做的方式可能不是。您只需要创建一个空的图像对象并跟踪图像对象ID,然后在select_image内重新配置该对象即可。

例如,不要在主程序中定义image_tk。将在画布上创建图像项的行更改为此:

image_id = canvas.create_image(0,0, anchor="nw")

(注意:如果没有anchor选项,则图像的中心将位于0,0。我猜您希望图像的左上角位于0,0)。 / p>

接下来,在select_image中,您将完成获取图像,保存对其的引用(以避免在函数返回时将其删除)并将其显示在画布中的所有工作。看起来像这样:

def select_image(): 
    # ask the user for the filename
    file_path = filedialog.askopenfilename()

    # only show the image if they chose something
    if file_path:
        # open the file
        image = Image.open(file_path)

        # create the image object, and save it so that it
        # won't get deleted by the garbage collector
        canvas.image_tk = ImageTk.PhotoImage(image)

        # configure the canvas item to use this image
        canvas.itemconfigure(image_id, image=canvas.image_tk)

答案 1 :(得分:-1)

您在这里遇到了几个问题:

  1. 您永远不会调用函数!您的代码将忽略 select_image()定义后

  2. 变量image仅在(未调用的)函数中定义,因此当您尝试通过ImageTk.PhotoImage()使用它时,它是 未定义。

尝试以这种方式返回图像对象:

from tkinter import *
from PIL import Image, ImageTk
from tkinter import filedialog

root = Tk()

#function to select my image by using the filedialog
def select_image(): 
    file_path = filedialog.askopenfilename()
    return Image.open(file_path)

#button to press to open filedialog
select = Button(root, text="select an image", command=select_image)
select.pack()

#the canvas where the image will be display
canvas = Canvas(root, width= 100, height=100, bg="grey")
canvas.pack()

image_tk = ImageTk.PhotoImage(select_image())
canvas.create_image(0,0, image= image_tk)


root.mainloop()

请注意,您没有在select_image()函数中检查错误或取消。您最好也处理函数内部的取消或错误