Setiap kali saya mencoba menyimpan gambar yang dipilih dari tkinter, saya mendapatkan kesalahan seperti ini:

    raise ValueError("unknown file extension: {}".format(ext)) from e
ValueError: unknown file extension: 

Saya menggunakan tkinter untuk membuka browser file untuk memilih file gambar. Pengguna dapat memilih untuk membalik gambar secara horizontal dan vertikal. Setelah itu, mereka dapat memilih untuk menyimpan sebagai berbagai format gambar. Namun, ini mengembalikan kesalahan di atas. Saya tidak benar-benar melihat apa yang salah. Variabel nama dalam fungsi save() berisi nama setelah file diambil. Fungsi simpan PIL harus dapat mengambil nama itu dan menyimpannya di direktori kerja saat ini.

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()


0
James Huang 9 Juli 2020, 04:02

1 menjawab

Jawaban Terbaik

Anda bisa meneruskan argumen typevariable di asksaveasfilename:

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.
2
jizhihaoSAMA 9 Juli 2020, 06:33