Python3-如何使用TKINTER从web检索图像并在GUI中显示?

Python3-如何使用TKINTER从web检索图像并在GUI中显示?,python,user-interface,tkinter,urllib,Python,User Interface,Tkinter,Urllib,我想要一个函数,当单击一个按钮时,它将使用URLLIB从web获取一个图像,并使用TKINTER在GUI中显示它 我对URLLIB和TKINTER都是新手,所以我在做这件事时遇到了难以置信的困难。 尝试过这个,但显然不起作用,因为它使用文本框,只显示文本 def __init__(self, root): self.root = root self.root.title('Image Retrieval Program') self.init_widgets() d

我想要一个函数,当单击一个按钮时,它将使用URLLIB从web获取一个图像,并使用TKINTER在GUI中显示它

我对URLLIB和TKINTER都是新手,所以我在做这件事时遇到了难以置信的困难。
尝试过这个,但显然不起作用,因为它使用文本框,只显示文本

 def __init__(self, root):
    self.root = root
    self.root.title('Image Retrieval Program')
    self.init_widgets()


def init_widgets(self):
    self.btn = ttk.Button(self.root, command=self.get_url, text='Get Url', width=8)
    self.btn.grid(column=0, row=0, sticky='w')

    self.entry = ttk.Entry(self.root, width=60)
    self.entry.grid(column=0, row=0, sticky='e')

    self.txt = tkinter.Text(self.root, width=80, height=20)
    self.txt.grid(column=0, row=1, sticky='nwes')
    sb = ttk.Scrollbar(command=self.txt.yview, orient='vertical')
    sb.grid(column=1, row=1, sticky='ns')
    self.txt['yscrollcommand'] = sb.set

def get_url(self):
    s = urllib.request.urlretrieve("http://www.smellymonkey.com/monkeys/images/ill-monkey.gif", "dog.gif")
    tkimage = ImageTk.PhotoImage(im)
    self.txt.insert(tkinter.INSERT, s)

我不使用Python3,但我可以给出一个在Python2.5+中工作的答案。我假设代码在Python3上的工作方式几乎相同

在开始之前,我们需要导入Tkinter并创建根窗口:

import Tkinter as tk
root = tk.Tk()
接下来,要使用urllib下载图像:

import urllib
URL = "http://www.smellymonkey.com/monkeys/images/ill-monkey.gif"
u = urllib.urlopen(URL)
raw_data = u.read()
u.close()
现在,在变量
raw\u data
中有了图像的二进制数据。Tkinter接受
数据
选项,但不幸的是,您无法向其提供这些原始数据。它希望数据编码为base64。这很容易做到:

import base64
b64_data = base64.encodestring(raw_data)
image = tk.PhotoImage(data=b64_data)
现在我们有了一个图像,是时候把它放到屏幕上了:

label = tk.Label(image=image)
label.pack()
您现在应该可以看到屏幕上的图像

以上仅适用于.gif图像,但其他图像格式几乎同样易于处理。最简单的方法是将原始图像数据写入磁盘(或使用urllib直接将数据下载到文件),并在创建
PhotoImage
对象时引用该文件。当然,这只适用于
PhotoImage
类直接支持的图像格式

您的另一个选择是使用PIL(Python图像库),它支持多种不同的图像格式。该技术大致相同,只是您必须首先创建一个PIL图像,然后将其转换为Tkinter可用的格式。有关PIL的更多信息,请参阅和