2011-05-22 102 views
4

我想要一個函數,當點擊一個按鈕時,它將使用URLLIB從Web上獲取圖像,並使用TKINTER將其顯示在GUI中。Python 3-如何從網上檢索圖像並使用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) 

回答

9

我不使用python 3,但我可以給出一個在python 2.5+中有效的答案。我假設的代碼將工作幾乎相同的蟒蛇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類直接支持的圖像格式。

你的另一種選擇是使用支持許多不同圖像格式的PIL(Python圖像庫)。該技術大致相同,只有您必須先創建PIL圖像,然後將其轉換爲Tkinter可用的格式。有關PIL的更多信息,請諮詢Python Imaging Library Handbook以及effbot documentation on The Tkinter PhotoImage Class

+0

非常感謝。 – Parseltongue 2011-05-22 22:43:36

相關問題