python - 如何在不冻结UI的情况下一个接一个地运行Qthread?
问题描述
如何一个接一个地运行Qthread?
对于以下代码:
import sys
from PyQt5 import QtCore, QtWidgets
class MyWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('MyWindow')
self._main = QtWidgets.QWidget()
self.setCentralWidget(self._main)
self.button = QtWidgets.QPushButton('Run')
self.button.clicked.connect(self.my_method)
layout = QtWidgets.QGridLayout(self._main)
layout.addWidget(self.button)
layout.addWidget(self.button)
def my_method(self):
for i in range(0,3):
self.n = 5
self.loadthread = MyThread(self.n, self)
self.loadthread.start()
class MyThread(QtCore.QThread):
def __init__(self, n, parent=None):
QtCore.QThread.__init__(self, parent)
self.n = n
def run(self):
for i in range(self.n):
print(i)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
screen = MyWindow()
screen.show()
sys.exit(app.exec_())
我得到的输出为:
0
1
0
2
3
1
2
3
4
4
0
1
2
3
4
线程同时运行。我希望它一个接一个地运行。
期望的输出:
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
一个线程完成后如何运行线程?
我尝试使用 thread.wait()。有用。但在此期间用户界面冻结。
解决方案
我看到你的任务是这样的:
import sys
from PyQt5 import QtCore, QtWidgets
class MyThread(QtCore.QThread):
def __init__(self, n, parent=None):
QtCore.QThread.__init__(self, parent)
self.n = n
def run(self):
for i in range(self.n):
print(i)
self.msleep(50)
class MyWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('MyWindow')
self._main = QtWidgets.QWidget()
self.setCentralWidget(self._main)
self.button = QtWidgets.QPushButton('Run')
self.button.clicked.connect(self.my_method)
layout = QtWidgets.QGridLayout(self._main)
layout.addWidget(self.button)
layout.addWidget(self.button)
self.n = 5
self.loadthread = MyThread(self.n, self)
self.loadthread.finished.connect(self.task_finished)
def my_method(self):
self.button.setEnabled(False)
self.number_of_tasks = 3
self.list_tasks = [i for i in range(self.number_of_tasks, 0, -1)]
self.load_task()
def load_task(self):
self.number_of_tasks -= 1
self.task = self.list_tasks[self.number_of_tasks]
print(f'\n Start task: {self.task}')
self.loadthread.start()
def task_finished(self):
print(f'--- Finish task: {self.task}')
if self.number_of_tasks:
self.load_task()
else:
self.button.setEnabled(True)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
screen = MyWindow()
screen.show()
sys.exit(app.exec_())
推荐阅读
- javascript - 我如何创建频道 Discord.JS
- parsing - 用于播放的 mp4 解析
- python - 如何使用 python 编写大型 txt 文件的每个字符?
- c# - 获取具有更改分辨率的桌面图标的坐标 C#
- delphi - 将 HTTP 重定向到 HTTPS TWebModule Delphi
- python - 为什么我在安装 Tensorflow 时出错?
- firebase - How should I save references to firebase storage objects?
- mysql - mysql连接表并搜索where子句的最新记录
- python - 单击提交按钮后,flask-wtforms 会显示一个弹出窗口
- c# - 在选取器上绑定 SelectedItem 不起作用