【发布时间】: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