【问题标题】:How do I display an Image (from URL) in Tkinter如何在 Tkinter 中显示图像(来自 URL)
【发布时间】:2021-06-26 19:04:37
【问题描述】:

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

def getImageFromURL(url):
    print('hai')
    raw_data = urlopen(url).read()
    im = Image.open(BytesIO(raw_data))
    image = ImageTk.PhotoImage(im)
    return image

我使用这个函数的代码是:

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

但是,代码使 tkinter 窗口崩溃(不响应),但没有错误。我该如何解决这个问题?

【问题讨论】:

  • 可能是因为下载图片需要时间,在单独的线程上运行。
  • @CoolCloud 我将如何让它等待下载完成?

标签: python image url tkinter


【解决方案1】:

您可以使用线程从 Internet 获取图像,并使用 tkinter 虚拟事件在图像加载时通知 tkinter 应用程序。

下面是示例代码:

import threading
import tkinter as tk
from urllib.request import urlopen
from PIL import ImageTk

def getImageFromURL(url, controller):
    print('hai')
    try:
        controller.image = ImageTk.PhotoImage(file=urlopen(url))
        # notify controller that image has been downloaded
        controller.event_generate("<<ImageLoaded>>")
    except Exception as e:
        print(e)

class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.imagelab = tk.Label(self, text="Loading image from internet ...", width=50, height=5)
        self.imagelab.pack()

        self.bind("<<ImageLoaded>>", self.on_image_loaded)

        # start a thread to fetch the image
        url = "https://batman-news.com/wp-content/uploads/2017/11/Justice-League-Superman-Banner.jpg"
        threading.Thread(target=getImageFromURL, args=(url, self)).start()

    def on_image_loaded(self, event):
        self.imagelab.config(image=self.image, width=self.image.width(), height=self.image.height())

App().mainloop()

【讨论】:

  • 仍然进入无响应状态:I
  • 它在我的两台 Windows 机器上运行良好。能否提供图片网址进行测试?
  • 好的,我发现了问题,我正在尝试解决它。​​
  • 好吧,@acw1668 我的问题是一个 for 循环,它循环一个图片 URL 的全局列表,每 3 秒更改一次图片,直到列表为空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 2021-02-12
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
相关资源
最近更新 更多