'Picture won't open in File Dialog, Tkinter, Pillow

I have written this.

Its short and supposed to open a file dialog window, with buttons "open a file, turn, save, exit." I want to open a jpeg, turn it 180° and then save it and quit.

The program starts, but doesnt open the picture in the file dialog window after I select it in the browser.

from tkinter import *
from PIL import Image, ImageTk
from tkinter import ttk
from tkinter import filedialog
from tkinter.filedialog import askopenfilenames


root = Tk() ##pro Tkinter

root.title('Image Browser')
root.geometry('100x100')


def open():
    global my_image
    root.filename = filedialog.askopenfilenames(initialdir='/gui/pillow', filetypes=[('Images','*.jpg *.jpeg *.png')])
    #my_label = Label(root, text = root.filename).pack()
    my_image = ImageTk.PhotoImage(Image.open(root.filename))
    my_image_label = Label(image=my_image).pack()

def turn():
    return
    my_image = my_image.transpose(Image.FLIP_RIGHT_LEFT)

def save():
    return
    my_image.save('somepic.jpg')


button = Button (root, text = 'Select a File', command = open)
button.pack()
button4 = Button (root, text = 'Turn', command = turn)
button4.pack()
button2 = Button (root, text = 'Save', command = save)
button2.pack()
button3 = Button(root, text = 'Exit', command = jadro.quit)
button3.pack()


root.mainloop()

After I select and try to open the file, it says this

AttributeError: 'tuple' object has no attribute 'seek'

I feel like I've tried everything, but cant seem to solve it. Thanks for any help



Solution 1:[1]

askopenfilenames return a tuple.

Try this instead

my_image = ImageTk.PhotoImage(Image.open(root.filename[0]))

Solution 2:[2]

From Python DOC

tkinter.filedialog.askopenfilename(**options)
tkinter.filedialog.askopenfilenames(**options)

The above two functions create an Open dialog and return the selected filename(s) that correspond to existing file(s).

Therefore askopenfilenames() returns a tuple of filenames, instead Image.open(fp) requires a file pointer as argument, not a tuple.

From Pillow DOC:

PIL.Image.open(fp, mode='r', formats=None)

fp – A filename (string), pathlib.Path object or a file object. The file object must implement file.read, file.seek, and file.tell methods, and be opened in binary mode.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 scotty3785
Solution 2