Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt5 QWebview刷新问题_Python_Pyqt_Pyqt5_Plotly_Qwebengineview - Fatal编程技术网

Python PyQt5 QWebview刷新问题

Python PyQt5 QWebview刷新问题,python,pyqt,pyqt5,plotly,qwebengineview,Python,Pyqt,Pyqt5,Plotly,Qwebengineview,我使用QWebEngineView并将其设置为HTML。当我显示它时,HTML总是小于我给QWebEngineView的总面积。在页面上单击鼠标右键并单击“重新加载”总是可以解决问题,但我不希望最终用户每次都单击“重新加载”。我已经在网上搜索了重新加载的方法,发现: my_qwebengineview.page().action(QWebEnginePage.Reload).trigger() 不过,这并不像右键单击那样调整大小 如果它有助于阅读代码,那么它会将一个绘图显示为一个HTML页面

我使用QWebEngineView并将其设置为HTML。当我显示它时,HTML总是小于我给QWebEngineView的总面积。在页面上单击鼠标右键并单击“重新加载”总是可以解决问题,但我不希望最终用户每次都单击“重新加载”。我已经在网上搜索了重新加载的方法,发现:

my_qwebengineview.page().action(QWebEnginePage.Reload).trigger()
不过,这并不像右键单击那样调整大小

如果它有助于阅读代码,那么它会将一个绘图显示为一个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的代码来自此数据,是我从SQL加载到其他地方的pandas数据框,但我在这里包含了一个玩具数据框:

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

你可以提供一个代码,用必要的HTML复制你的错误,因为这是产生错误的主要元素,很多我用过QWebEngineView,我没有这个问题,也许这是一个特殊的问题,我不想从一开始就创建代码来观察错误,也许从来没有观察过。这很难解释,但我不能真正分享HTML。它从本地源加载plotly-min.js,因此我不需要连接到internet即可使用它,因此在运行它之前需要对其进行修改。如果有帮助的话,我可以给你生成HTML的代码。当然,可能出于专业原因,我不能共享那个特定的项目,但是如果你共享另一个复制错误的项目,这将帮助我测试它并能够提出解决方案。我添加了用于生成HTML的代码。您需要一个带有一些虚拟变量(包括一列日期)的pandas数据框,下载plotly-min.js并将其与代码放在同一文件夹中。谢谢你看!让我们的生活变得轻松,共享数据框架,我不想浪费时间来制作一只适合你们的熊猫。