Python Tkinter TkinterHtml无法运行

时间:2016-02-24 04:04:15

标签: python python-3.x tkinter tcl

我正在尝试创建一个自动安装pypi软件包的应用程序,该软件包解析了使用urlopen从网站中选择的用户。我设法得到html,解码并将其转换为TkinterHtml小部件。但是,它将使用APPCRASH使python解释器崩溃。因此,我将已删除的URL替换为更简单的html文本。但是,这次它不会将图像渲染到窗口小部件上(非图像标记像p一样工作正常)。我试图阅读tcl版本的文档,但我无法将其应用于python。 我从here安装了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()

1 个答案:

答案 0 :(得分: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图像的列表   名称和脚本,然后在没有时删除图像   需要更长时间,评估脚本。