【问题标题】:Python 3 tkinter | Image from URL not displaying [duplicate]Python 3 tkinter |来自 URL 的图像未显示 [重复]
【发布时间】:2019-04-27 04:08:06
【问题描述】:

首先,我的代码是基于this StackOverflow answer的。

由于情况,我试图将大部分代码打包到一个我称之为ImgFromUrl()的函数中

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

def ImgFromUrl(root, url):
    with urllib.request.urlopen(url) as connection:
        raw_data = connection.read()
    im = Image.open(io.BytesIO(raw_data))
    image = ImageTk.PhotoImage(im)
    return tk.Label(root, image=image)

root = tk.Tk()
url = "http://imgs.xkcd.com/comics/python.png"

widget = ImgFromUrl(root,url)
widget.grid(row=0,column=0)

root.mainloop()

由于某种原因,图像没有显示(尽管 Tkinter 窗口已自动调整为图像大小)。

但是,这是可行的:

# same imports

root = tk.Tk()
url = "http://imgs.xkcd.com/comics/python.png"

with urllib.request.urlopen(url) as connection:
    raw_data = connection.read()
im = Image.open(io.BytesIO(raw_data))
image = ImageTk.PhotoImage(im)

widget = tk.Label(root, image=image)
widget.grid(row=0,column=0)

root.mainloop()

【问题讨论】:

  • 您需要将图像引用保存在函数之外,否则它会在函数完成后消失。
  • @Mike-SMT 你能具体说明哪个变量是引用吗?
  • image = ImageTk.PhotoImage(im) 在函数结束后立即被删除,因此您需要将其保存为全局变量。那就是说你为什么要这样创建你的小部件?它的接缝过于复杂。
  • 我觉得我可能每周至少关闭 2-3 次这样的副本。

标签: python tkinter widget python-imaging-library urllib


【解决方案1】:

所以您的问题是因为 image 在函数结束后立即被删除,并且 tkinter 需要保存图像以供某处参考。

我们可以使用global 或通过将图像返回到全局定义的变量来做到这一点。

选项1global

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


def ImgFromUrl(url):
    global image
    with urllib.request.urlopen(url) as connection:
        raw_data = connection.read()
    im = Image.open(io.BytesIO(raw_data))
    image = ImageTk.PhotoImage(im)
    return image

root = tk.Tk()
url = "http://imgs.xkcd.com/comics/python.png"
widget = tk.Label(root, image=ImgFromUrl(url))
widget.grid(row=0, column=0)

root.mainloop()

选项 2 将图像对象返回到全局命名空间中定义的变量:

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


def ImgFromUrl(url):
    with urllib.request.urlopen(url) as connection:
        raw_data = connection.read()
    im = Image.open(io.BytesIO(raw_data))
    image = ImageTk.PhotoImage(im)
    return image

root = tk.Tk()
url = "http://imgs.xkcd.com/comics/python.png"
image = ImgFromUrl(url)
widget = tk.Label(root, image=image)
widget.grid(row=0, column=0)

root.mainloop()

【讨论】:

    猜你喜欢
    • 2016-11-05
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    相关资源
    最近更新 更多