Python 无法从TKinter的URL加载图像

Python 无法从TKinter的URL加载图像,python,tkinter,base64,python-imaging-library,urllib,Python,Tkinter,Base64,Python Imaging Library,Urllib,我的目标是使用tkinter python从URL显示JPG图像 这是我用作参考的。但是当我尝试运行代码时,我收到了一系列错误,例如: 键错误:b'R0l AttributeError:“PhotoImage”对象没有属性“\u PhotoImage\u photo” 有人能解决这个问题吗 代码如下: import tkinter as tk from PIL import Image, ImageTk from urllib.request import urlopen import ba

我的目标是使用tkinter python从URL显示JPG图像

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

  • 键错误:b'R0l
  • AttributeError:“PhotoImage”对象没有属性“\u PhotoImage\u 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)
中指定
数据
参数。但是,我不确定为什么
PhotoImage
无法读取base64数据

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

我找到了从中打开图像的代码


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

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

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

我找到了从中打开图像的代码


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

我无法让您的示例对我起作用,但请尝试指定您正在使用
ImageTk.PhotoImage(data=b64_data)传递
数据
参数。
@Hobbes:我添加了'data'参数和第一个错误(KeyError)消失。但随后出现一个新错误(OSError:无法识别图像文件),AttributeError:“PhotoImage”对象没有属性“\u PhotoImage\u photo”仍然存在。我无法让您的示例适用于我,但请尝试指定您正在使用
ImageTk.PhotoImage(data=b64\u data)传递
数据
参数
@Hobbes:我添加了'data'参数,第一个错误(KeyError)消失了。但随后出现了一个新的错误(OSError:无法识别图像文件)而且AttributeError:“PhotoImage”对象没有属性“\u PhotoImage\u photo”仍然存在。只有当我将“StringIO”更改为“BytesIO”时,您的代码才能工作。非常感谢您提供了此解决方案。在这种情况下,BytesIO更有意义。我已进行编辑以反映这一点。只有当我将“StringIO”更改为“BytesIO”时,您的代码才能工作。谢谢y非常感谢这个解决方案。在这种情况下,BytesIO更有意义。我进行了编辑以反映这一点。
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()