几天前我开始了一个项目,但不幸的是我被困住了。我想制作一个图像编辑器(一个非常简单的; 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()
答案 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)
您在这里遇到了几个问题:
您永远不会调用函数!您的代码将忽略
select_image()
定义后
变量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()函数中检查错误或取消。您最好也处理函数内部的取消或错误