PIL Python Ошибка выдачи модуля при сохранении изображения с помощью Tkinter - PullRequest
2 голосов
/ 09 июля 2020

Всякий раз, когда я пытаюсь сохранить изображение, выбранное из tkinter, я получаю такую ​​ошибку:

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

Я использую tkinter, чтобы открыть браузер файлов для выбора файла изображения. Пользователь может выбрать переворачивание изображения по горизонтали и вертикали. После этого они могут выбрать сохранение в различных форматах изображений. Однако это возвращает указанную выше ошибку. Я действительно не понимаю, что не так. Переменная name в функции save () содержит имя после выбора файла. Функция сохранения PIL должна иметь возможность взять это имя и сохранить его в текущем рабочем каталоге.

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


1 Ответ

2 голосов
/ 09 июля 2020

Вы можете передать аргумент typevariable в 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.
...