无法从 TKinter 的 URL 加载图像
Unable to Load an Image from an URL at TKinter
我的目标是使用 tkinter python 显示来自 URL 的 JPG 图像。
这是我用作参考的Whosebug link。但是当我尝试 运行 代码时,我收到了一堆错误,例如:
- KeyError: b'R0l.......
- AttributeError: 'PhotoImage' 对象没有属性 '_PhotoImage__photo'
有人对此有解决方案吗?
这是代码:
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()
我的目标是使用 tkinter python 显示来自 URL 的 JPG 图像。
这是我用作参考的Whosebug link。但是当我尝试 运行 代码时,我收到了一堆错误,例如:
- KeyError: b'R0l.......
- AttributeError: 'PhotoImage' 对象没有属性 '_PhotoImage__photo'
有人对此有解决方案吗?
这是代码:
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()