PyQt5在循环期间停止响应

时间:2018-06-29 20:27:11

标签: python python-3.x pyqt5

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

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

在Windows上,它完全无法工作。

我如何使其工作?

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

app.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"))

为了让读者理解得更好,我对帖子进行了编辑,我使用“睡眠”来模拟应用程序必须完成的工作。特别是在第一部分中,我异步启动了Web爬虫:

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)

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

谢谢。

0 个答案:

没有答案