2016-02-24 149 views
1

我想做一個應用程序,它會自動安裝pypi包解析用戶從使用urlopen網站選擇的用戶。我設法得到的HTML,解碼並feeded它到TkinterHtml部件。然而,它會崩潰python解釋器與APPCRASH。因此,我將retieved網址替換爲更簡單的html文本。但是,這次它不會將圖像渲染到窗口小部件上(非圖像標籤可以像p一樣正常工作)。我曾嘗試閱讀tcl版本的文檔,但我無法將其應用於python。 我從here安裝了tkinterhtml。蟒蛇Tkinter TkinterHtml不能正常運作

from urllib.request import urlopen 
try: 
    import tkinter as tk 
    from tkinter import ttk 
except ImportError: 
    import Tkinter as tk 
    import ttk 

from tkinterhtml import TkinterHtml 

root = tk.Tk() 

html = TkinterHtml(root, fontscale=0.8) 
vsb = ttk.Scrollbar(root, orient=tk.VERTICAL, command=html.yview) 
hsb = ttk.Scrollbar(root, orient=tk.HORIZONTAL, command=html.xview) 
html.configure(yscrollcommand=vsb.set) 
html.configure(xscrollcommand=hsb.set) 



#html.tag("configure", "selection", "-background", "black") 

html.grid(row=0, column=0, sticky=tk.NSEW) 
vsb.grid(row=0, column=1, sticky=tk.NSEW) 
hsb.grid(row=1, column=0, sticky=tk.NSEW) 
root.columnconfigure(0, weight=1) 
root.rowconfigure(0, weight=1) 
#data = urlopen("http://www.wikipedia.org").read().decode() 
#html.parse(data) 
html.parse(""" 
<html> 
<body> 
<h1>Hello world!</h1> 
<p>First para</p> 
    <ul> 
    <li>first list item</li> 
    <li>second list item</li> 
    <img src="http://upload.wikimedia.org/wikipedia/en/3/38/Google_App_Engine_Logo.png"></img> 
</ul> 
</body> 
</html> 
""") 

root.mainloop() 

回答

2

您需要一個函數來檢索圖像並創建一個Tk對象。這似乎爲我工作,

from PIL import Image, ImageTk 
import io 

# needed to hold references 
images = {} 

def test(url): 
    fp = urlopen(url) 
    data = fp.read() 
    fp.close() 

    image = Image.open(io.BytesIO(data)) 
    photo = ImageTk.PhotoImage(image) 
    images[url] = photo 
    return photo 

root = tk.Tk() 

# define imagecmd callback imagecmd=test in order to handle the images 
html = TkinterHtml(root, fontscale=0.8, imagecmd=test) 

tkhtml documentation(TkInterHtml是tkhtml3包裝)指出

除了更換整個文檔節點(即),圖像 其他幾個使用以CSS格式化文檔中的上下文爲例,將 作爲列表標記或背景。如果-imagecmd選項不是 設置爲空字符串(默認值),則每次在文檔中遇到圖像URI爲 時,它都會附加到-imagecmd腳本 並對結果列表進行評估。

該命令應該返回一個空字符串,一個Tk 圖像的名稱,或者一個正好兩個元素的列表,一個Tk圖像的名稱和一個 腳本。如果結果是空字符串,則不顯示圖像 。如果結果是Tk圖像名稱,則圖像將顯示在窗口小部件中 。當圖像不再需要時,刪除 。如果命令的結果是包含Tk圖像 名稱和腳本的列表,則在不需要更長的 時刪除圖像,而是評估該腳本。

+0

如果用戶要按網頁中的超鏈接,我如何檢索URL並解析所有引用的圖像?有沒有回調呢? – user3167683

+0

另外,如何使用這個?你打電話給測試功能嗎?或者你只是解析(urlopen(「http://wikipedia.org」).read()。decode())? – user3167683

+0

@ user3167683我的猜測是TkInterHtml僅適用於渲染網頁,而不適合用戶交互。 –