python - 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)
在这两种情况下,应用程序都会停止工作并且不会更新进度信息。
提前致谢。
解决方案
推荐阅读
- jxbrowser - 如果发生证书错误,JxBrowser 注册 ServiceWorker 失败
- android - 带有 RemoteView 和操作的自定义 Android 通知
- git - 如果我当前分支的源代码包含字符串,git pre-push 钩子可以警告我吗?
- pdfmake - pdfMake 创建方法参数无效
- jquery - 如何在 MVC5 中通过 Ajax 填充输入字段?
- android - TextInputLayout:以编程方式设置框的描边颜色(突出显示和不突出显示)
- fullcalendar - 更改 GCal 事件的时区
- neo4j - 如何返回在 Y 跳上至少有 X 条路径的所有节点
- reactjs - 使用 URL 设置背景样式以在反应中定位图像时找不到图像
- regex - 重命名树中具有包含在基本名称中的扩展名的文件