我将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)
在两种情况下,应用程序都会停止工作并且不会更新进度信息。
谢谢。