首先,我的代码基于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()
答案 0 :(得分:1)
所以您的问题是,image
一旦函数结束就被删除了,并且tkinter需要将图像保存在某个地方以供参考。
我们可以使用global
或通过将图像返回到全局变量中来实现。
选项1 global
:
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()