【问题标题】:Saving tkinter canvas with Pillow saves extensionless file but won't specify extension使用 Pillow 保存 tkinter 画布可以保存无扩展名文件,但不会指定扩展名
【发布时间】:2018-05-24 11:52:56
【问题描述】:

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

到目前为止,除了保存功能外,一切正常。保存对话框有效。我能够让我的代码保存文件,但它从不将其保存为 PNG。事实上,它根本不保存任何扩展名,但如果我不指定 format="PNG" 那么它甚至不会保存文件,只会抛出 ValueError: ValueError('未知文件扩展名:{}'.format(ext)) ValueError:未知文件扩展名:.

为简单起见,这里是我的代码的所有相关部分。我可能做错了什么?

(作为参考,我是一个超级初学者。我刚刚完成了 Python 课程的介绍,我正在尝试分支到一些更高级的东西。我已经搜索并搜索了解决方案,但我不知所措。另外我意识到如果我从 PIL/tkinter 导入所有内容,那么我不应该指定具体的东西,但如果我不具体,我会得到不同的错误。我的有限理解是这是某种已知的错误还是什么?)

编辑:忘记提及当我保存无扩展名文件时,如果我手动将其从“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()

【问题讨论】:

  • asksaveasfilename 之后,您检查了filename 中的内容吗?如果您的名称没有扩展名,那么save() 将保存它而不使用扩展名。它不添加extension,也不使用扩展来识别以什么格式保存它。

标签: python python-3.x tkinter pillow


【解决方案1】:

您可以尝试为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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多