Python 3 - Как получить изображение из Интернета и отобразить в графическом интерфейсе с помощью TKINTER? - PullRequest
4 голосов
/ 22 мая 2011

Мне нужна функция, которая при нажатии кнопки берет изображение из Интернета с помощью URLLIB и отображает его в графическом интерфейсе с помощью TKINTER.

Я новичок и в 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)

1 Ответ

9 голосов
/ 22 мая 2011

Я не использую Python 3, но могу дать ответ, который работает в Python 2.5+.Я предполагаю, что код будет работать почти одинаково на Python 3.

Прежде чем мы начнем, нам нужно импортировать 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_data.Tkinter принимает опцию data, но, к сожалению, вы не можете передать ей эти необработанные данные.Ожидается, что данные будут закодированы как 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 Image Library), которая поддерживает множество различных форматов изображений.Техника остается примерно такой же, только вы должны сначала создать изображение PIL, а затем преобразовать его в формат, используемый Tkinter.Для получения дополнительной информации о PIL обратитесь к Руководству по библиотеке изображений Python , а также к документации effbot по Tkinter PhotoImage Class

...