无法从 TKinter 的 URL 加载图像

Unable to Load an Image from an URL at TKinter

我的目标是使用 tkinter python 显示来自 URL 的 JPG 图像。

这是我用作参考的Whosebug link。但是当我尝试 运行 代码时,我收到了一堆错误,例如:

有人对此有解决方案吗?

这是代码:

import tkinter as tk
from PIL import Image, ImageTk
from urllib.request import urlopen
import base64

root = tk.Tk()

URL = "http://www.universeofsymbolism.com/images/ram-spirit-animal.jpg"
u = urlopen(URL)
raw_data = u.read()
u.close()


b64_data = base64.encodestring(raw_data)
photo = ImageTk.PhotoImage(b64_data)

label = tk.Label(image=photo)
label.image = photo
label.pack()

root.mainloop()

第一个错误是未在 ImageTk.PhotoImage(data=b64_data) 中指定 data 参数。但是,我不确定为什么 PhotoImage 无法读取 base64 数据。

解决方法是使用 io 模块中的 BytesIO。您可以将从图像中读取的原始数据传递到 BytesIO,在 Image 中打开它,然后将其传递到 PhotoImage.

我从here找到打开图片的代码。

import tkinter as tk
from PIL import Image, ImageTk
from urllib2 import urlopen
from io import BytesIO

root = tk.Tk()

URL = "http://www.universeofsymbolism.com/images/ram-spirit-animal.jpg"
u = urlopen(URL)
raw_data = u.read()
u.close()

im = Image.open(BytesIO(raw_data))
photo = ImageTk.PhotoImage(im)

label = tk.Label(image=photo)
label.image = photo
label.pack()

root.mainloop()

如果有人对编码失败的原因有更好的答案,那么这个问题的答案会更合适。

非常相似但比霍布斯的答案更简单,您可以直接在ImageTk.PhotoImage构造函数中使用data参数:

import tkinter as tk
from PIL import Image, ImageTk
from urllib.request import urlopen

root = tk.Tk()

URL = "http://www.universeofsymbolism.com/images/ram-spirit-animal.jpg"
u = urlopen(URL)
raw_data = u.read()
u.close()

photo = ImageTk.PhotoImage(data=raw_data) # <-----

label = tk.Label(image=photo)
label.image = photo
label.pack()

root.mainloop()