QWebEngineView刷新异常:点击按钮重载Plotly HTML后程序崩溃
问题分析与修复方案
问题根源
程序停止运行和使用QWidget还是QMainWindow无关,核心问题出在chartshow方法里的无限循环与time.sleep(10):
Qt的GUI线程依赖事件循环处理界面交互、重绘等操作,time.sleep()会直接阻塞整个事件循环,加上无限循环一直占用线程资源,导致程序彻底无法响应任何操作,看起来就像停止运行了。
修复方案
用Qt原生的QTimer实现定时重载逻辑,这是Qt推荐的异步定时方式,不会阻塞事件循环。修改后的完整代码如下:
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication from PyQt5.QtWebEngineWidgets import QWebEngineView from PyQt5.QtCore import QUrl, QTimer import sys class Window1(QWidget): def __init__(self): super().__init__() self.setGeometry(700, 350, 400, 400) self.setWindowTitle("Data Downloader") self.UI() # 初始化定时器,用于定时重载页面 self.reload_timer = QTimer(self) self.reload_timer.timeout.connect(self.browser.reload) def UI(self): self.dldata = QPushButton("Start", self) self.dldata.move(250, 25) self.dldata.clicked.connect(self.start_reload) self.browser = QWebEngineView(self) self.browser.move(1, 100) self.browser.setFixedWidth(400) self.browser.setFixedHeight(400) url = QUrl.fromLocalFile(r"\ht.html") self.browser.load(url) def start_reload(self): # 设置定时器每隔10秒触发一次重载,启动定时器 self.reload_timer.start(10000) def main(): app = QApplication(sys.argv) window = Window1() window.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
修改说明
- 移除了阻塞事件循环的
while循环和time.sleep(),改用QTimer实现定时任务 - 点击按钮后启动定时器,定时器每隔10秒自动触发浏览器的
reload()方法 - 如果需要停止重载,可新增一个按钮,连接
self.reload_timer.stop()方法即可
内容的提问来源于stack exchange,提问作者user3119822
相关产品推荐
相关产品推荐

