私は色々な色で複数の四角形を生成するはずの個人プロジェクトに取り組んできました。次に保存ダイアログボックスを開き、ファイルを保存し、ユーザーが[保存]ボタンをクリックしたときに画像を保存します。tkinter canvas with Pillowを保存すると、拡張子は保存されますが、拡張子は指定されません
これまでsave関数を除いてすべてが機能しています。保存ダイアログが機能します。ファイルを保存するコードを取得できますが、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'を追加せず、拡張子を使用してそれを保存する形式を認識することはありません。 – furas
[TKinterを使用してファイル拡張子を追加するにはどうすればいいですか?](https://stackoverflow.com/questions/46517738/how-can-i-add-a-file-extension-using-tkinter) – Nae