在PySimpleGUI中如何呈现HTML?

3
有人知道是否可以让PySimpleGUI呈现HTML吗?
我不需要完整的浏览器,只需要一个在PySimpleGUI窗口中运行的HTML查看器。
我知道tkinter有一个名为“tk_html_widgets”的模块,我也在研究“webview”模块能做什么。
我知道Qt是可以实现的,因为PySide带有这种小部件,但我真的很喜欢PySimpleGUI。
我只是想知道是否有人有建议来完成这个功能。
例如,我能否将TK小部件(如“tk_html_widgets”)导入到PySimpleGUI中。
也许我遗漏了些内容,而pysimpleGUI已经拥有我不知道的HTML元素。
2个回答

3
这里只是作为参考,使用库tkhtmlview来进行HTML解析和构建。
当超时事件发生时,您可以调用set_html(advertise, html)来更新新的广告/HTML,这可能会在从互联网加载某些内容时等待。
from tkhtmlview import html_parser
import PySimpleGUI as sg

def set_html(widget, html, strip=True):
    prev_state = widget.cget('state')
    widget.config(state=sg.tk.NORMAL)
    widget.delete('1.0', sg.tk.END)
    widget.tag_delete(widget.tag_names)
    html_parser.w_set_html(widget, html, strip=strip)
    widget.config(state=prev_state)

html = """
<td colspan="2" class="infobox-image"><a href="https://en.wikipedia.org/wiki/RoboCop" class="image">
<img alt="RoboCop (1987) theatrical poster.jpg" src="https://upload.wikimedia.org/wikipedia/en/thumb/1/16/RoboCop_%281987%29_theatrical_poster.jpg/220px-RoboCop_%281987%29_theatrical_poster.jpg" decoding="async" width="250" height="386" class="thumbborder" srcset="//upload.wikimedia.org/wikipedia/en/1/16/RoboCop_%281987%29_theatrical_poster.jpg 1.5x" data-file-width="248" data-file-height="374"></a>
<div class="infobox-caption" style="text-align:center">Directed by Paul Verhoeven<br>Release date July 17, 1987</div></td>
"""

font = ("Courier New", 12, 'bold')
sg.theme("DarkBlue3")
sg.set_options(font=font)

layout_advertise = [
    [sg.Multiline(
        size=(25, 10),
        border_width=2,
        text_color='white',
        background_color='green',
        disabled=True,
        no_scrollbar=True,
        expand_x=True,
        expand_y=True,
        key='Advertise')],
]

keypad = [
    ["Rad/Deg",          "x!",   "(",  ")", "%", "AC"],
    ["Inv",       "sin", "ln",   "7", "8", "9", "÷" ],
    ["Pi",        "cos", "log",  "4",  "5", "6", "x" ],
    ["e",         "tan", "√",    "1",  "2", "3", "-" ],
    ["Ans",       "EXP", "POW",  "0",  ".", "=", "+" ],
]

layout_calculator = [
    [sg.Button(
        key,
        size=(7, 4),
        expand_x=key=="Rad/Deg",
        button_color=('white', '#405373') if key in "1234567890" else sg.theme_button_color(),
     ) for key in line]
            for line in keypad]

layout = [
    [sg.Frame("Calculator", layout_calculator, expand_x=True, expand_y=True),
     sg.Frame("Advertise",  layout_advertise, expand_x=True, expand_y=True)],
]
window = sg.Window('Title', layout, finalize=True, use_default_focus=False)
for element in window.key_dict.values():
    element.block_focus()

advertise = window['Advertise'].Widget

html_parser = html_parser.HTMLTextParser()
set_html(advertise, html)
width, height = advertise.winfo_width(), advertise.winfo_height()

while True:

    event, values = window.read()
    if event in (sg.WINDOW_CLOSED, 'Exit'):
        break
    print(event, values)

window.close()

enter image description here


你在 PySimpleGUIQt 中有示例吗? - SkySibe
不,我现在对如何在PySimpleGUIQt中进行操作毫无头绪。 - Jason Yang

1

看起来您可以使用tkhtmlview小部件来完成此操作。 我认为关键是使用PySimpleGUI Window的TKroot属性获取对tk根节点的句柄。 您应该能够使用该句柄绘制大多数tk小部件。 以下是在PySimpleGUI窗口中绘制HTML标签的简单示例:

import PySimpleGUI as sg
from tkhtmlview import HTMLLabel

layout = [[]]

window = sg.Window('Canvas test', layout, finalize=True)

my_label = HTMLLabel(window.TKroot, html='<h1>foobar</h1>')

my_label.pack()

while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接