首页 > 解决方案 > PyQt5在循环期间停止响应

问题描述

我将 PyQt5 用于一个简单的项目,在作业期间应用程序停止响应并更新进度信息。

在 linux 上,它继续在后台工作,当工作完成后,它会重新开始正确地工作。

在 Windows 上,它完全停止工作。

我怎样才能让它工作?

这是应用程序和 gui 实现的一些示例代码:

应用程序.py

import sys
from time import sleep
from PyQt5 import QtWidgets

from PyQt5.QtWidgets import QMainWindow
from mygui import Ui_MainWindow


class MyGui(QMainWindow):
    def __init__(self):
        super(MyGui, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.start.clicked.connect(self.dojob)
        self.setFixedSize(self.size())
        self.show()

    def dojob(self, signal):
        for i in range(101):
            self.ui.bar.setValue(i)
            self.ui.bar.update()
            sleep(1)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MyGui()
    window.show()
    sys.exit(app.exec_())

mygui.py

# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'mygui.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(462, 72)
        self.widget = QtWidgets.QWidget(MainWindow)
        self.widget.setObjectName("widget")
        self.start = QtWidgets.QPushButton(self.widget)
        self.start.setGeometry(QtCore.QRect(350, 40, 99, 27))
        self.start.setObjectName("start")
        self.bar = QtWidgets.QProgressBar(self.widget)
        self.bar.setGeometry(QtCore.QRect(10, 10, 441, 23))
        self.bar.setProperty("value", 0)
        self.bar.setObjectName("bar")
        MainWindow.setCentralWidget(self.widget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MyGui"))
        self.start.setText(_translate("MainWindow", "start"))

为了更好地理解,我编辑了帖子,我使用“睡眠”来模拟应用程序必须执行的工作。特别是在第一部分中,我异步启动了一个网络爬虫:

runner = CrawlerRunner()
deff = runner.crawl(...)
deff.addBoth(lambda _: reactor.stop())
reactor.run()

后来我下载了一些解析的图像:

opener = request.build_opener()
opener.addheaders = [('User-Agent', self.AGENTS)]
request.install_opener(opener)
request.urlretrieve(img, img_path)

在这两种情况下,应用程序都会停止工作并且不会更新进度信息。

提前致谢。

标签: pythonpython-3.xpyqt5

解决方案


推荐阅读