首先,我的代码基于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()
所以你的问题是因为
image
函数一结束就被删除,而tkinter需要保存图像以供某处引用。你知道吗我们可以通过
global
或将图像返回到全局函数中定义的变量来实现这一点。你知道吗选项1
global
:选项2将图像对象返回到全局命名空间中定义的变量:
相关问题 更多 >
编程相关推荐