Python 如何在Tkinter中显示图像(来自URL)

Python 如何在Tkinter中显示图像(来自URL),python,image,url,tkinter,Python,Image,Url,Tkinter,我想在Tkinter中显示URL中的图像。 这是我目前的职能: def getImageFromURL(url): 打印('hai') 原始数据=urlopen(url).read() im=Image.open(BytesIO(原始数据)) image=ImageTk.PhotoImage(im) 返回图像 我使用这个函数的代码是: 打印(imgJSON[currentIndex]) img=getImageFromURL(imgJSON[currentIndex]) imagelab=tk

我想在Tkinter中显示URL中的图像。 这是我目前的职能:

def getImageFromURL(url):
打印('hai')
原始数据=urlopen(url).read()
im=Image.open(BytesIO(原始数据))
image=ImageTk.PhotoImage(im)
返回图像
我使用这个函数的代码是:

打印(imgJSON[currentIndex])
img=getImageFromURL(imgJSON[currentIndex])
imagelab=tk.Label(self,image=img)
imagelab.image=img
imagelab.pack()

但是,代码使tkinter窗口崩溃(没有响应),但没有错误。如何修复此问题?

您可以使用线程从internet获取映像,并使用tkinter虚拟事件在映像加载后通知tkinter应用程序

下面是一个示例代码:

导入线程
将tkinter作为tk导入
从urllib.request导入urlopen
从PIL导入ImageTk
def getImageFromURL(url,控制器):
打印('hai')
尝试:
controller.image=ImageTk.PhotoImage(文件=urlopen(url))
#通知控制器映像已下载
controller.event_generate(“”)
例外情况除外,如e:
打印(e)
类应用程序(tk.tk):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.imagelab=tk.Label(self,text=“从internet加载图像…”,宽度=50,高度=5)
self.imagelab.pack()
self.bind(“,self.on\u图像\u加载)
#启动一个线程来获取图像
url=”https://batman-news.com/wp-content/uploads/2017/11/Justice-League-Superman-Banner.jpg"
threading.Thread(target=getImageFromURL,args=(url,self)).start()
已加载图像上的def(自身、事件):
self.imagelab.config(image=self.image,width=self.image.width(),height=self.image.height())
App().mainloop()

可能是因为下载映像需要时间,所以在单独的线程上运行它。@CoolCloud我如何使它等待下载完成?仍然会进入无响应状态:IIt在我的两台Windows机器上工作正常。你能提供图像URL进行测试吗?好的,我发现了问题,我正在尝试解决它。好的,所以@acw1668我的问题是一个for循环,它循环一个全局图像URL列表,并每3秒钟更改一次图像,直到列表为空。