【发布时间】:2017-03-25 03:51:29
【问题描述】:
我正在尝试编写一个运行时间很长但不是 CPU 密集型进程的 pyqt5 应用程序。我希望能够在不挂起 UI 的情况下运行它,所以我正在尝试使用线程,但是因为我似乎不能只运行一个线程并在它通过它的代码后让它停止,这样它可以再次运行,我已经尝试设置线程等待变量在运行前更改。
我知道这不是在 pyqt 应用程序中运行长进程的正确模式。
import time
import threading
from PyQt5 import QtWidgets, uic
class MyApp(QtWidgets.QMainWindow):
_run_thread = False
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
self.ui = uic.loadUi('myapp.ui', self)
self.ui.start_thread_button.clicked.connect(self._run_thread_function)
self._thread = threading.Thread(target=self._run_thread_callback)
self._thread.daemon = True
self._thread.start()
self.ui.show()
def _run_thread_callback(self):
while True:
if self._run_thread:
print("running thread code...")
time.sleep(10)
print("thread code finished")
self._run_thread = False
def _run_thread_function(self):
print("starting thread...")
self._run_thread = True
def main():
app = QtWidgets.QApplication(sys.argv)
MyApp()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
【问题讨论】:
-
好吧,你会遇到问题,因为你有一个名为
self._run_thread的方法和一个同名的实例属性。在某些时候,您会用布尔值覆盖您的方法。但不管怎样,您可能应该切换到 QThreads。看看stackoverflow.com/documentation/pyqt/2775/…,它应该很容易适应 PyQt5。页面底部还有一些关于线程安全的准则。 -
好的,我已经更改了函数的名称,但这只是一个示例,并不是我问题的重点。因此,从我听到的消息来看,原生 python
threading模块不适合与 Qt 一起使用。对于任何 UI 应用程序都是这样吗?例如,如果我从 Qt 切换到 Tkinter,我可以使用threading模块吗?
标签: python multithreading pyqt pyqt5 python-multithreading