蟒蛇Tkinter TkinterHtml不能正常运作

问题描述:

我想做一个应用程序,它会自动安装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() 

您需要一个函数来检索图像并创建一个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仅适用于渲染网页,而不适合用户交互。 –