You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

修改说明

  1. 移除了阻塞事件循环的while循环和time.sleep(),改用QTimer实现定时任务
  2. 点击按钮后启动定时器,定时器每隔10秒自动触发浏览器的reload()方法
  3. 如果需要停止重载,可新增一个按钮,连接self.reload_timer.stop()方法即可

内容的提问来源于stack exchange,提问作者user3119822

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:01:12