在 PySimpleGUI 中呈现 HTML?
Rendering HTML in PySimpleGUI?
有谁知道 PySimpleGUI 是否可以渲染 HTML?
我不是在追求一个成熟的浏览器,只是一个 HTML 位于 PySimpleGUI window.
中的查看器
我知道 tkinter 有一个名为 tk_html_widgets
的模块,我也在研究 webview
模块可以做什么。
我知道 Qt 是可能的,因为 PySide 带有这种性质的小部件,尽管我真的很喜欢 PySimpleGUI。
我只是想知道是否有人有实现此目标的建议。
例如,我能否以某种方式将 tk_html_widgets
等 TK 小部件导入 PySimpleGUI。
也许我遗漏了什么,pysimpleGUI 已经有一个我不知道的 HTML 元素。
看来您可以使用 tkhtmlview 小部件执行此操作。我认为关键是使用 PySimpleGUI Window 的 TKroot 属性获取 tk 根节点的句柄。您应该能够使用该句柄绘制大多数 tk 小部件。这是一个在 PySimpleGUI window:
中绘制 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
此处仅供参考,库 tkhtmlview
用于 HTML 解析器和构建器。
您可以调用 set_html(advertise, html)
来更新新的 advertise/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()
有谁知道 PySimpleGUI 是否可以渲染 HTML?
我不是在追求一个成熟的浏览器,只是一个 HTML 位于 PySimpleGUI window.
中的查看器我知道 tkinter 有一个名为 tk_html_widgets
的模块,我也在研究 webview
模块可以做什么。
我知道 Qt 是可能的,因为 PySide 带有这种性质的小部件,尽管我真的很喜欢 PySimpleGUI。
我只是想知道是否有人有实现此目标的建议。
例如,我能否以某种方式将 tk_html_widgets
等 TK 小部件导入 PySimpleGUI。
也许我遗漏了什么,pysimpleGUI 已经有一个我不知道的 HTML 元素。
看来您可以使用 tkhtmlview 小部件执行此操作。我认为关键是使用 PySimpleGUI Window 的 TKroot 属性获取 tk 根节点的句柄。您应该能够使用该句柄绘制大多数 tk 小部件。这是一个在 PySimpleGUI window:
中绘制 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
此处仅供参考,库 tkhtmlview
用于 HTML 解析器和构建器。
您可以调用 set_html(advertise, html)
来更新新的 advertise/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()