使用枕头保存tkinter画布可保存无扩展名文件,但不会指定扩展名



我一直在研究一个个人项目,该项目应该以不同的颜色生成几个正方形,然后打开一个保存对话框,让用户选择文件的名称,然后保存用户单击"保存"按钮时的图像。

到目前为止,除了保存功能外,一切都在工作。保存对话框有效。我能够获取我的代码来保存文件,但是它永远不会将其保存为PNG。实际上,它根本不会保存任何扩展名,但是如果我不指定格式=" png",那么它甚至不会保存文件,而只是抛出一个值:valueError('未知文件扩展名:{}'。格式(ext))ValueError:未知文件扩展名:。

为简单起见,这是我所讨论的代码的所有相关位。我会做什么错?

(为了参考,我是一个超级初学者。我刚刚完成了Python课程的简介,我正在尝试分支一些更高级的事情。我已经搜索并搜索了解决方案,但我是我还意识到,如果我从pil/tkinter中进口全部,那么我不必指定特定的内容,但是如果我不是具体的,我会得到不同的错误。我有限的理解是,这是某种已知的已知错误或其他?)

编辑:忘了提到,当我保存一个无扩展文件时,如果我手动从例如"测试"到'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")

最新更新