I'm creating a GUI where I want to display a site with qWebView and reload it automaticly every 10 seconds.
I tried with a qThread, no results. (I'm a new with threading) And if I use a normal while loop my window freeze.
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets
class updator(QtCore.QThread):
def __init__(self, window):
QtCore.QThread.__init__(self)
def run(self):
while True:
self.sleep(2000 * 2 / 1000)
self.window.htmlreader_BTCLiveGraph.reload()
class Ui_BTC_LiveGraph(object):
def setupUi(self, BTC_LiveGraph):
BTC_LiveGraph.setObjectName("BTC_LiveGraph")
BTC_LiveGraph.resize(1600, 900)
BTC_LiveGraph.setAccessibleDescription("")
self.htmlreader_BTCLiveGraph = QtWebEngineWidgets.QWebEngineView(
BTC_LiveGraph)
self.htmlreader_BTCLiveGraph.setGeometry(
QtCore.QRect(10, 10, 1500, 800))
self.htmlreader_BTCLiveGraph.setAccessibleDescription("")
# récupération du chemin absolu du fichier
self.mypath = os.path.dirname(__file__)
self.htmlreader_BTCLiveGraph.setUrl(QtCore.QUrl(
str("file:///" + self.mypath + "/BTC_liveGraph.html")))
self.htmlreader_BTCLiveGraph.setObjectName("htmlreader_BTCLiveGraph")
self.retranslateUi(BTC_LiveGraph)
QtCore.QMetaObject.connectSlotsByName(BTC_LiveGraph)
def retranslateUi(self, BTC_LiveGraph):
_translate = QtCore.QCoreApplication.translate
BTC_LiveGraph.setWindowTitle(
_translate("BTC_LiveGraph", "BTC Live Graph"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
BTC_LiveGraph = QtWidgets.QDialog()
ui = Ui_BTC_LiveGraph()
ui.setupUi(BTC_LiveGraph)
BTC_LiveGraph.show()
update = updator(ui)
update.start()
sys.exit(app.exec_())
I would like the qwebviewWidget to reload every 10 seconds smouthly and having no freeze for the window
I think a QTimer
is a better way to tackle this problem, here is a working example:
import os
import sys
from PyQt5.Qt import QApplication, QMainWindow
from PyQt5.QtCore import QThread, QRect, QUrl, QCoreApplication, QMetaObject, QTimer
from PyQt5.QtWebEngineWidgets import QWebEngineView
class Ui_BTC_LiveGraph(object):
def setupUi(self, widget):
widget.setObjectName("BTC_LiveGraph")
widget.resize(1600, 900)
widget.setAccessibleDescription("")
self.htmlreader_BTCLiveGraph = QWebEngineView(widget)
self.htmlreader_BTCLiveGraph.setGeometry(QRect(10, 10, 1500, 800))
self.htmlreader_BTCLiveGraph.setAccessibleDescription("")
self.htmlreader_BTCLiveGraph.setObjectName("htmlreader_BTCLiveGraph")
self.retranslateUi(widget)
QMetaObject.connectSlotsByName(widget)
def retranslateUi(self, widget):
_translate = QCoreApplication.translate
widget.setWindowTitle(_translate("BTC_LiveGraph", "BTC Live Graph"))
class MainWindow(Ui_BTC_LiveGraph, QMainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
# You can do this here, just keep the Ui class for UI stuff
self.mypath = os.path.dirname(__file__)
self.htmlreader_BTCLiveGraph.setUrl(QUrl('http://www.stackoverflow.com'))
self._updator = QTimer(self)
self._updator.setSingleShot(False)
self._updator.timeout.connect(self.reload)
# Reload every 4 seconds
self._updator.start(4000)
def reload(self):
self.htmlreader_BTCLiveGraph.reload()
if __name__ == "__main__":
app = QApplication(sys.argv)
BTC_LiveGraph = MainWindow()
BTC_LiveGraph.show()
sys.exit(app.exec_())