使用 Pillow 保存 tkinter canvas 可以保存无扩展名的文件,但不会指定扩展名
Saving tkinter canvas with Pillow saves extensionless file but won't specify extension
我一直在做一个个人项目,它应该生成几个不同颜色的正方形,然后打开一个保存对话框,让用户选择文件名,并在用户单击时保存图像保存按钮。
到目前为止,除了保存功能外,一切正常。保存对话框有效。我能够获取我的代码来保存文件,但它永远不会将其保存为 PNG。事实上,它根本不保存任何扩展名,但如果我不指定 format="PNG" 那么它甚至不会保存文件,只会抛出一个 ValueError:
ValueError('unknown file extension: {}'.format(ext))
ValueError:未知文件扩展名:.
为简单起见,这里是我的相关代码的所有相关部分。我可能做错了什么?
(仅供参考,我是一个超级初学者。我刚刚完成了 Python 课程的介绍,我正在尝试学习一些更高级的东西。我已经搜索并搜索了解决方案为此,但我不知所措。我还意识到,如果我从 PIL/tkinter 导入所有内容,那么我不必指定具体的内容,但如果我不具体,我会得到不同的错误。这是我有限的理解这是某种已知错误还是什么?)
edit:忘记提及当我保存一个无扩展名的文件时,如果我手动将它从 'test' 重命名为 'test.png',图像会正确显示。换句话说,我可以看到我的代码保存了正确的数据,但它只是出于某种原因没有将 .png 添加到文件名中。
from tkinter import *
from tkinter import filedialog
from PIL import Image, ImageDraw, ImageGrab, PngImagePlugin
from PIL import *
class MyFrame(Frame):
def __init__(self):
Frame.__init__(self)
self.grid()
self.myCanvas = Canvas(self, width=400, height=175)
self.myCanvas.grid(row = 1, columnspan = 5)
self.myCanvas.create_rectangle(10, 10, 50, 50, fill="blue")
self.button_saveImage = Button(self, text = "Save", command = self.save_image)
self.button_saveImage.grid(row = 4, column = 4, padx = 5, pady=15)
def save_image(self):
x=self.winfo_rootx()+self.myCanvas.winfo_x()
y=self.winfo_rooty()+self.myCanvas.winfo_y()
x1=x+self.myCanvas.winfo_width()
y1=y+self.myCanvas.winfo_height()
filename = filedialog.asksaveasfilename(initialdir = "C:/Users/desktop.ini",
title = "Select file",
filetypes = (("PNG files","*.png"),("All files","*.*")))
ImageGrab.grab().crop((x,y,x1,y1)).save(filename, format="PNG")
frame01 = MyFrame()
frame01.mainloop()
mainloop()
您可以尝试为 filedialog.asksaveasfilename
方法配置 defaultextension=".png"
。
如:
filename = filedialog.asksaveasfilename(initialdir = "C:/Users/desktop.ini",
title = "Select file",
filetypes = (("PNG files","*.png"),("All files","*.*")))
需要:
filename = filedialog.asksaveasfilename(initialdir = "C:/Users/desktop.ini",
title = "Select file",
filetypes = (("PNG files","*.png"),("All files","*.*"))
defaultextension=".png")
我一直在做一个个人项目,它应该生成几个不同颜色的正方形,然后打开一个保存对话框,让用户选择文件名,并在用户单击时保存图像保存按钮。
到目前为止,除了保存功能外,一切正常。保存对话框有效。我能够获取我的代码来保存文件,但它永远不会将其保存为 PNG。事实上,它根本不保存任何扩展名,但如果我不指定 format="PNG" 那么它甚至不会保存文件,只会抛出一个 ValueError: ValueError('unknown file extension: {}'.format(ext)) ValueError:未知文件扩展名:.
为简单起见,这里是我的相关代码的所有相关部分。我可能做错了什么?
(仅供参考,我是一个超级初学者。我刚刚完成了 Python 课程的介绍,我正在尝试学习一些更高级的东西。我已经搜索并搜索了解决方案为此,但我不知所措。我还意识到,如果我从 PIL/tkinter 导入所有内容,那么我不必指定具体的内容,但如果我不具体,我会得到不同的错误。这是我有限的理解这是某种已知错误还是什么?)
edit:忘记提及当我保存一个无扩展名的文件时,如果我手动将它从 'test' 重命名为 'test.png',图像会正确显示。换句话说,我可以看到我的代码保存了正确的数据,但它只是出于某种原因没有将 .png 添加到文件名中。
from tkinter import *
from tkinter import filedialog
from PIL import Image, ImageDraw, ImageGrab, PngImagePlugin
from PIL import *
class MyFrame(Frame):
def __init__(self):
Frame.__init__(self)
self.grid()
self.myCanvas = Canvas(self, width=400, height=175)
self.myCanvas.grid(row = 1, columnspan = 5)
self.myCanvas.create_rectangle(10, 10, 50, 50, fill="blue")
self.button_saveImage = Button(self, text = "Save", command = self.save_image)
self.button_saveImage.grid(row = 4, column = 4, padx = 5, pady=15)
def save_image(self):
x=self.winfo_rootx()+self.myCanvas.winfo_x()
y=self.winfo_rooty()+self.myCanvas.winfo_y()
x1=x+self.myCanvas.winfo_width()
y1=y+self.myCanvas.winfo_height()
filename = filedialog.asksaveasfilename(initialdir = "C:/Users/desktop.ini",
title = "Select file",
filetypes = (("PNG files","*.png"),("All files","*.*")))
ImageGrab.grab().crop((x,y,x1,y1)).save(filename, format="PNG")
frame01 = MyFrame()
frame01.mainloop()
mainloop()
您可以尝试为 filedialog.asksaveasfilename
方法配置 defaultextension=".png"
。
如:
filename = filedialog.asksaveasfilename(initialdir = "C:/Users/desktop.ini",
title = "Select file",
filetypes = (("PNG files","*.png"),("All files","*.*")))
需要:
filename = filedialog.asksaveasfilename(initialdir = "C:/Users/desktop.ini",
title = "Select file",
filetypes = (("PNG files","*.png"),("All files","*.*"))
defaultextension=".png")