gpt4 book ai didi

python - PyQt5 如果Python仍在运行,如何在使用evaluateJavaScript时更新GUI

转载 作者:行者123 更新时间:2023-12-01 07:05:55 25 4
gpt4 key购买 nike

我想使用evaluateJavaScript命令动态修改我的GUI

我注意到只有当 python 完成工作时 GUI 才会更新。我创建了这个示例代码:

基本 GUI:

webView = QWebView()
myObj = ExampleClass(webView)
webView.page().mainFrame().addToJavaScriptWindowObject("pyObj", myObj)
webView.setHtml('''
<html>
<body>
<div id="content"></div>
<button onClick="pyObj.example()">start</button>
</body>
</html>
''')

用于更新 Html GUI 的 Python 代码:

class ExampleClass(QtCore.QObject):
def __init__(self, webView):
super(ExampleClass, self).__init__(webView)
self.webView = webView

@QtCore.pyqtSlot()
def example(self):
print("start")
for i in range(0,5):
print(i)
self.webView.page().mainFrame().evaluateJavaScript('document.getElementById("content").innerHTML = "'+str(i)+'";')
time.sleep(1)
#simulation of a heavy code
for a in range(0,999):
for b in range(0,9999):
c = a * b;

目标:按下“开始”按钮后,我希望看到数字 0 1 2 3 4 按顺序出现在我的 GUI 中。当前结果:按“开始”按钮N秒后没有任何反应,然后出现数字4

最佳答案

@gelonida指出,一般的解决方案是使用线程并通过信号通知GUI,所以我的回答提供了一个可能的实现。

要在线程中实现,必须在顺序任务中重新排列 for 循环,例如使用迭代器,然后在任务完成时通过信号调用下一个循环。对于本例中的耗时任务,我创建了一个位于另一个线程中的工作人员,并且必须调用“任务”方法。

import sys
from PyQt5 import QtCore, QtWidgets, QtWebKitWidgets


class Worker(QtCore.QObject):
finished = QtCore.pyqtSignal()

@QtCore.pyqtSlot()
def task(self):
# simulation of a heavy code
for a in range(999):
for b in range(9999):
c = a * b
self.finished.emit()


class ExampleClass(QtCore.QObject):
def __init__(self, webView):
super(ExampleClass, self).__init__(webView)
self.webView = webView

thread = QtCore.QThread(self)
thread.start()

self.m_worker = Worker()
self.m_worker.moveToThread(thread)
self.m_worker.finished.connect(self.execute)

self.m_numbers = None

@QtCore.pyqtSlot()
def example(self):
print("example")
self.m_numbers = iter(range(5))
self.execute()

@QtCore.pyqtSlot()
def execute(self):
if self.m_numbers is None:
return
try:
i = next(self.m_numbers)
except StopIteration:
return
else:
self.webView.page().mainFrame().evaluateJavaScript(
'document.getElementById("content").innerHTML = "{}";'.format(i)
)
QtCore.QTimer.singleShot(1000, self.m_worker.task)


if __name__ == "__main__":
html = """<html>
<body>
<div id="content"></div>
<button onClick="pyObj.example()">start</button>
</body>
</html>"""

app = QtWidgets.QApplication(sys.argv)

view = QtWebKitWidgets.QWebView()
obj = ExampleClass(view)
view.page().mainFrame().addToJavaScriptWindowObject("pyObj", obj)
view.setHtml(html)
view.resize(640, 480)
view.show()
sys.exit(app.exec_())

关于python - PyQt5 如果Python仍在运行,如何在使用evaluateJavaScript时更新GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58447100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com