Отобразить BLOB MySQL на форме Tkinter
Я хочу получить изображение из базы данных и отобразить его на форме. Перепробовала разные варианты, но не получается. Вот мой последний вариант кода
curs.execute('call show_img(%s)', name) #sql запрос
photo = curs.fetchone()
print(photo["img"])
image = Image.open(io.BytesIO(photo["img"]))
render = ImageTk.PhotoImage(image)
img = Label(image=render)
img.place(x=0, y=0)
в результате в photo хранится вот такое значение
{'img': b'/Users/leylanyssanbayeva/Documents/images/\xd0\xb4\xd0\xb6\xd0\xb5\xd0\xb8\xcc\x86\xd1\x80\xd0\xb0\xd0\xbd.jpeg'}
именно в этом варианте кода получаю вот такую ошибку
Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/tkinter/__init__.py", line 1892, in __call__
return self.func(*args)
File "/Users/leylanyssanbayeva/Documents/redbook/main.py", line 248, in <lambda>
f3b1 = Button(f3, text='Поиск', font="Arial 15", command=lambda: search_animal(ent_f3.get()))
File "/Users/leylanyssanbayeva/Documents/redbook/main.py", line 225, in search_animal
image = Image.open(io.BytesIO(photo["img"]))
File "/Users/leylanyssanbayeva/Documents/redbook/venv/lib/python3.9/site-packages/PIL/Image.py", line 3030, in open
raise UnidentifiedImageError(
PIL.UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0x7feab8073d60>
буду очень благодарна, впервые работаю по учебе с этой библиотекой
Ответы (2 шт):
Просто декодируйте имя файла из bytes в string.
image_file_name = photo["img"].decode()
image = Image.open(image_file_name)
Моя ошибка была в том, что я пробовала использовать decode(), но делала это неправильно. Следующей проблемой было то, что вместо изображения отображался белый прямоугольник. Как оказалось, это из за того, что я писала все это в функции. Как решение нужно всего лишь использовать mainloop() для lable. Код:
curs.execute('call show_img(%s)', name) # sql запрос
photo = curs.fetchone()
#print(photo["img"].decode())
img = photo["img"].decode()
image = ImageTk.PhotoImage(file=img)
image_sprite = Label(f3, image=image)
image_sprite.place(x=450, y=180, width=320, height=250)
image_sprite.mainloop()