我正在创建一个GUI,我要在其中显示带有qWebView的站点并每10秒自动重新加载一次。
我尝试使用qThread,但没有结果。 (我是新来的线程) 如果我使用常规的while循环,则窗口冻结。
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_())
我希望qwebviewWidget每隔10秒重新载入一次,并且窗口不冻结
答案 0 :(得分:1)
我认为QTimer
是解决此问题的更好方法,这是一个有效的示例:
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_())