PyQt5 QWebview刷新问题
PyQt5 QWebview Refresh Issue
我使用 QWebEngineView 并将其设置为 HTML。当我显示它时,HTML 总是小于我给 QWebEngineView 的总面积。右键单击页面并单击 "Reload" 总是可以解决问题,但我不希望最终用户每次都单击 "Reload"。我已经在网上搜索了重新加载的方法,发现:
my_qwebengineview.page().action(QWebEnginePage.Reload).trigger()
不过,这并没有像右键单击那样调整大小。
如果它有助于阅读代码,它会将 Plotly 绘图显示为 HTML 页(长话短说)。
我使用以下代码创建了它所在的小部件:
grid_layout = QGridLayout()
logo = QLabel()
logo_pixmap = QPixmap('logo.jpg')
logo.setPixmap(logo_pixmap)
grid_layout.addWidget(logo, 0, 0, 2, 6)
grid_layout.addItem(QSpacerItem(500, 50, QSizePolicy.Minimum, QSizePolicy.Expanding), 0, 6)
graph_label = QLabel('Graph')
graph_names_combobox = QComboBox()
grid_layout.addWidget(graph_label, 0, 7, 1, 1)
grid_layout.addWidget(self.graph_names_combobox, 0, 8, 1, 4)
self.graph_widget = QStackedWidget()
grid_layout.addWidget(self.graph_widget, 2, 1, 10, 12)
self.graph_window_widget = QWidget()
self.graph_window_widget.setLayout(grid_layout)
稍后我使用:
temp_webpage = QWebEngineView()
temp_webpage.setHTML(*graph html goes here*)
self.graph_widget.addWidget(temp_webpage)
# In the course of the full program, a lot of graphs are added, so reloading
# them all here.
for child in self.graph_widget.children()
if type(child) == QWebEngineView:
child.page().action(QWebEnginePage.Reload).trigger()
我在将堆叠小部件设置为所选图表后立即尝试使用重新加载代码,但正如我所说,结果相同。
有没有办法让页面执行与右键单击 -> 重新加载相同的操作?
编辑
为了回应一条评论,我用来生成 html 的代码来自于此(数据是一个 pandas DataFrame,我从 SQL 其他地方加载,但我在这里包含了一个玩具 DataFrame):
path = QDir.current().filePath('plotly-latest.min.js')
local = QUrl.fromLocalFile(path).toString()
data_frame = DataFrame(index=(range(2)),columns=('Date', 'SKUs', 'Lines', 'Orders', 'Eaches'))
data_frame.loc[0:1,'Date'] = (datetime.date(1999, 1, 1), datetime.date(1999, 1, 2))
data_frame.loc[0:1,'SKUs'] = (12, 13)
data_frame.loc[0:1,'Lines'] = (14, 15)
data_frame.loc[0:1,'Orders'] = (16, 17)
data_frame.loc[0:1,'Eaches'] = (18, 19)
trace_lines = Bar(x=data_frame['Date'], y=data_frame['Lines'], name='Lines', visible=True)
trace_orders = Bar(x=data_frame['Date'], y=data_frame['Orders'], name='Orders', visible=False)
trace_eaches = Bar(x=data_frame['Date'], y=data_frame['Eaches'], name='Eaches', visible=False)
trace_SKUs = Bar(x=data_frame['Date'], y=data_frame['SKUs'], name='SKUs', visible=False)
data = [trace_lines, trace_orders, trace_eaches, trace_SKUs]
lines_title = "%s Lines" % name
orders_title = "%s Orders" % name
eaches_title = "%s Eaches" % name
skus_title = "%s SKUs" % name
update_menus = list([dict(active=0,
buttons=list([dict(label='Lines',
method='update',
args=[{'visible': [True, False, False, False]},
{'title': lines_title}]),
dict(label='Orders',
method='update',
args=[{'visible': [False, True, False, False]},
{'title': orders_title}]),
dict(label='Eaches',
method='update',
args=[{'visible': [False, False, True, False]},
{'title': eaches_title}]),
dict(label='SKUs',
method='update',
args=[{'visible': [False, False, False, True]},
{'title': skus_title}])]))])
layout = dict(title=lines_title, showlegend=False, updatemenus=update_menus, xaxis=dict(
rangeselector=dict(buttons=list([dict(count=1, label='1m', step='month', stepmode='backward'),
dict(count=6, label='6m', step='month', stepmode='backward'),
dict(step='all')])),
rangeslider=dict(),
type='date'
))
fig = dict(data=data, layout=layout)
raw_html = '<html><head><meta charset="utf-8" /><script src="{}"></script></head>'.format(local)
raw_html += '<body>'
raw_html += plot(fig, include_plotlyjs=False, output_type='div')
raw_html += '</body></html>'
return raw_html
一种可能的解决方法是重新加载页面,如下所示:
self.isFirst = True
temp_webpage.loadFinished.connect(self.onLoadFinished)
def onLoadFinished(self, ok):
if self.isFirst:
# self.sender().page().action(QWebEnginePage.Reload).trigger()
self.sender().reload()
self.isFirst = False
我使用 QWebEngineView 并将其设置为 HTML。当我显示它时,HTML 总是小于我给 QWebEngineView 的总面积。右键单击页面并单击 "Reload" 总是可以解决问题,但我不希望最终用户每次都单击 "Reload"。我已经在网上搜索了重新加载的方法,发现:
my_qwebengineview.page().action(QWebEnginePage.Reload).trigger()
不过,这并没有像右键单击那样调整大小。
如果它有助于阅读代码,它会将 Plotly 绘图显示为 HTML 页(长话短说)。
我使用以下代码创建了它所在的小部件:
grid_layout = QGridLayout()
logo = QLabel()
logo_pixmap = QPixmap('logo.jpg')
logo.setPixmap(logo_pixmap)
grid_layout.addWidget(logo, 0, 0, 2, 6)
grid_layout.addItem(QSpacerItem(500, 50, QSizePolicy.Minimum, QSizePolicy.Expanding), 0, 6)
graph_label = QLabel('Graph')
graph_names_combobox = QComboBox()
grid_layout.addWidget(graph_label, 0, 7, 1, 1)
grid_layout.addWidget(self.graph_names_combobox, 0, 8, 1, 4)
self.graph_widget = QStackedWidget()
grid_layout.addWidget(self.graph_widget, 2, 1, 10, 12)
self.graph_window_widget = QWidget()
self.graph_window_widget.setLayout(grid_layout)
稍后我使用:
temp_webpage = QWebEngineView()
temp_webpage.setHTML(*graph html goes here*)
self.graph_widget.addWidget(temp_webpage)
# In the course of the full program, a lot of graphs are added, so reloading
# them all here.
for child in self.graph_widget.children()
if type(child) == QWebEngineView:
child.page().action(QWebEnginePage.Reload).trigger()
我在将堆叠小部件设置为所选图表后立即尝试使用重新加载代码,但正如我所说,结果相同。
有没有办法让页面执行与右键单击 -> 重新加载相同的操作?
编辑
为了回应一条评论,我用来生成 html 的代码来自于此(数据是一个 pandas DataFrame,我从 SQL 其他地方加载,但我在这里包含了一个玩具 DataFrame):
path = QDir.current().filePath('plotly-latest.min.js')
local = QUrl.fromLocalFile(path).toString()
data_frame = DataFrame(index=(range(2)),columns=('Date', 'SKUs', 'Lines', 'Orders', 'Eaches'))
data_frame.loc[0:1,'Date'] = (datetime.date(1999, 1, 1), datetime.date(1999, 1, 2))
data_frame.loc[0:1,'SKUs'] = (12, 13)
data_frame.loc[0:1,'Lines'] = (14, 15)
data_frame.loc[0:1,'Orders'] = (16, 17)
data_frame.loc[0:1,'Eaches'] = (18, 19)
trace_lines = Bar(x=data_frame['Date'], y=data_frame['Lines'], name='Lines', visible=True)
trace_orders = Bar(x=data_frame['Date'], y=data_frame['Orders'], name='Orders', visible=False)
trace_eaches = Bar(x=data_frame['Date'], y=data_frame['Eaches'], name='Eaches', visible=False)
trace_SKUs = Bar(x=data_frame['Date'], y=data_frame['SKUs'], name='SKUs', visible=False)
data = [trace_lines, trace_orders, trace_eaches, trace_SKUs]
lines_title = "%s Lines" % name
orders_title = "%s Orders" % name
eaches_title = "%s Eaches" % name
skus_title = "%s SKUs" % name
update_menus = list([dict(active=0,
buttons=list([dict(label='Lines',
method='update',
args=[{'visible': [True, False, False, False]},
{'title': lines_title}]),
dict(label='Orders',
method='update',
args=[{'visible': [False, True, False, False]},
{'title': orders_title}]),
dict(label='Eaches',
method='update',
args=[{'visible': [False, False, True, False]},
{'title': eaches_title}]),
dict(label='SKUs',
method='update',
args=[{'visible': [False, False, False, True]},
{'title': skus_title}])]))])
layout = dict(title=lines_title, showlegend=False, updatemenus=update_menus, xaxis=dict(
rangeselector=dict(buttons=list([dict(count=1, label='1m', step='month', stepmode='backward'),
dict(count=6, label='6m', step='month', stepmode='backward'),
dict(step='all')])),
rangeslider=dict(),
type='date'
))
fig = dict(data=data, layout=layout)
raw_html = '<html><head><meta charset="utf-8" /><script src="{}"></script></head>'.format(local)
raw_html += '<body>'
raw_html += plot(fig, include_plotlyjs=False, output_type='div')
raw_html += '</body></html>'
return raw_html
一种可能的解决方法是重新加载页面,如下所示:
self.isFirst = True
temp_webpage.loadFinished.connect(self.onLoadFinished)
def onLoadFinished(self, ok):
if self.isFirst:
# self.sender().page().action(QWebEnginePage.Reload).trigger()
self.sender().reload()
self.isFirst = False