使用Tkinter保存图像时PIL Python模块抛出错误
每当我试图保存从tkinter选择的图像时,都会出现如下错误:使用Tkinter保存图像时PIL Python模块抛出错误,python,tkinter,python-imaging-library,Python,Tkinter,Python Imaging Library,每当我试图保存从tkinter选择的图像时,都会出现如下错误: raise ValueError("unknown file extension: {}".format(ext)) from e ValueError: unknown file extension: 我正在使用tkinter打开文件浏览器以选择图像文件。用户可以选择水平和垂直翻转图像。之后,他们可以选择保存为各种图像格式。但是,这将返回上述错误。我真的看不出有什么不对。save()函数中的name
raise ValueError("unknown file extension: {}".format(ext)) from e
ValueError: unknown file extension:
我正在使用tkinter打开文件浏览器以选择图像文件。用户可以选择水平和垂直翻转图像。之后,他们可以选择保存为各种图像格式。但是,这将返回上述错误。我真的看不出有什么不对。save()函数中的name变量包含拾取文件后的名称。PIL的save函数应该能够使用该名称并将其保存在当前工作目录中
from tkinter import *
from tkinter import filedialog
from PIL import Image
def open_image():
global img
img = Image.open(
filedialog.askopenfilename(title="Select file", filetypes=(("jpeg files", "*.jpg"), ("all files", "*.*"))))
save_button.config(bg=default_color)
flip_horizontal_button.config(bg=default_color)
flip_vertical_button.config(bg=default_color)
def flip_horizontal():
global img
if img:
img = img.transpose(Image.FLIP_LEFT_RIGHT)
def flip_vertical():
global img
if img:
img = img.transpose(Image.FLIP_TOP_BOTTOM)
def save():
global img
if img:
#os.chdir("/")
default_name = "Untitled"
""" print(default_name+"."+img.format)
print(os.path.isfile(default_name+"."+img.format))
print(os.path)
if os.path.isfile(default_name+"."+img.format):
expand = 1
while True:
expand += 1
expanded_name = default_name+str(expand)
if os.path.isfile(expanded_name):
continue
else:
default_name = expanded_name
break"""
name = filedialog.asksaveasfilename(title="Save As", filetypes=(
('JPEG', ('*.jpg', '*.jpeg', '*.jpe')), ('PNG', '*.png'), ('GIF', '*.gif')),
initialfile=default_name+"."+img.format)
img.save(name)
img = None
root = Tk()
root.title("Meme Deep Fryer")
root.geometry('600x500')
default_color = root.cget('bg')
open_button = Button(text='Open Image', font=('Arial', 20), command=open_image)
flip_horizontal_button = Button(text='Flip Horizontal', font=('Arial', 10), command=flip_horizontal, bg="gray")
flip_vertical_button = Button(text='Flip Vertical', font=('Arial', 10), command=flip_vertical, bg="gray")
save_button = Button(text='Save', font=('Arial', 20), command=save, bg="gray")
open_button.pack(anchor='nw', side=LEFT)
save_button.pack(anchor='nw', side=LEFT)
flip_horizontal_button.pack(anchor='w')
flip_vertical_button.pack(anchor='w')
root.mainloop()
您可以在
asksaveasfilename
中传递参数typevariable
:
ext = tkinter.StringVar()
name = filedialog.asksaveasfilename(title="Select file", typevariable=ext, filetypes=(('JPEG', ('*.jpg', '*.jpeg', '*.jpe')), ('PNG', '*.png'), ('BMP', ('*.bmp', '*.jdib')), ('GIF', '*.gif')))
if name:
img.save(os.path.basename(name)+"."+ext.get().lower()) # splice the string and the extension.
您可以在
asksaveasfilename
中传递参数typevariable
:
ext = tkinter.StringVar()
name = filedialog.asksaveasfilename(title="Select file", typevariable=ext, filetypes=(('JPEG', ('*.jpg', '*.jpeg', '*.jpe')), ('PNG', '*.png'), ('BMP', ('*.bmp', '*.jdib')), ('GIF', '*.gif')))
if name:
img.save(os.path.basename(name)+"."+ext.get().lower()) # splice the string and the extension.
错误表示您试图保存为不带扩展名的文件名。您可以使用defaultextension选项来防止人为更改error@EricMathieu如何将上载时的默认扩展名设置为图像扩展名同样,如果程序保存的文件名没有扩展名,那么filetypes=(filetypes)应该怎么做?所选文件类型不应该自动作为扩展名吗?@JamesHuang:既然你使用Path,你就可以使用Path(你的_路径)。后缀更新你的open_图像以获得你的文件名,将扩展名另存为全局文件,然后打开图像。错误表示您试图保存为不带扩展名的文件名。您可以使用defaultextension选项来防止人为更改error@EricMathieu如何将上载时的默认扩展名设置为图像扩展名如果程序保存的文件名没有扩展名,那么filetypes=(文件类型)应该做什么?所选文件类型不应该自动作为扩展名吗?@JamesHuang:既然你使用Path,你就可以使用Path(你的_路径)。后缀更新你的open_图像以获得你的文件名,将扩展名保存为全局文件,然后打开图像。这对我来说仍然不太管用。我想要的是,用户可以删除已填充的扩展名,并且仍然使用字符串保存它,程序可以以扩展名结尾。我试过了,结果并没有什么不同。如果您尝试保存此网页,然后删除默认文件名,然后保存,计算机将已为您设置文件扩展名。有办法吗?我已经更新了我的代码,以表明我已经得到了一个预填充的扩展名。@JamesHuang在我的示例中,用户只需输入文件名,它就会自动添加用户选择的扩展名。哦,我现在尝试了,它可以工作了!有没有办法将图像保存到我在askfilename中选择的文件夹中,因为操作系统只是将其保存到cwd中以供使用me@JamesHuang是的,只需删除
os.path.basename
。您不应该使用它。这样只会返回文件名而不是完整路径。它对我来说仍然不太管用。我想要的是,用户可以删除已填充的扩展名,并且仍然使用字符串保存它,程序可以以扩展名结尾。我试过了,结果并没有什么不同。如果您尝试保存此网页,然后删除默认文件名,然后保存,计算机将已为您设置文件扩展名。有办法吗?我已经更新了我的代码,以表明我已经得到了一个预填充的扩展名。@JamesHuang在我的示例中,用户只需输入文件名,它就会自动添加用户选择的扩展名。哦,我现在尝试了,它可以工作了!有没有办法将图像保存到我在askfilename中选择的文件夹中,因为操作系统只是将其保存到cwd中以供使用me@JamesHuang是的,只需删除os.path.basename
。您不应该使用它。这将只返回文件名,而不是完整路径。