如何在打开Popen电话时保持我的gui响应?

时间:2017-02-15 01:28:16

标签: python python-2.7 pyqt pyqt4

我正在试图让一个悸动者(以动画追逐箭头gif的形式)在我调用Popen命令时播放,但它不起作用因为我认为gui在Popen命令运行时完全没有响应。我怎样才能解决这个问题? 请检查下面的代码。

import subprocess
import os
import sys
from PyQt4 import QtCore, QtGui

class Test(QtGui.QDialog):

    def __init__(self, parent=None):
        super(Test, self).__init__(parent)
        self.setMinimumSize(200, 200)
        self.buttonUpdate = QtGui.QPushButton()
        self.buttonUpdate.setText("Get updates")
        self.lbl1 = QtGui.QLabel()
        self.lbl2 = QtGui.QLabel()
        self.lblm2 = QtGui.QLabel()

        gif = os.path.abspath("chassingarrows.gif")#throbber
        self.movie = QtGui.QMovie(gif)
        self.movie.setScaledSize(QtCore.QSize(20, 20))

        self.pixmap = QtGui.QPixmap("checkmark.png")#green checkmark
        self.pixmap2 = self.pixmap.scaled(20, 20)

        verticalLayout = QtGui.QVBoxLayout(self)
        h2 = QtGui.QHBoxLayout()
        h2.addWidget(self.lblm2)
        h2.addWidget(self.lbl2)

        h2.setAlignment(QtCore.Qt.AlignCenter)

        verticalLayout.addWidget(self.lbl1)
        verticalLayout.addLayout(h2)
        verticalLayout.addWidget(self.buttonUpdate, 0, QtCore.Qt.AlignRight)
        self.buttonUpdate.clicked.connect(self.get_updates)

    def get_updates(self):
        try:
            self.lbl1.setText("Updating")
            self.lblm2.setMovie(self.movie)
            self.movie.start()
            self.setCursor(QtCore.Qt.BusyCursor)
            p1 = subprocess.Popen(['apt', 'update'], stdout=subprocess.PIPE,  bufsize=1)
            p1.wait()
            self.movie.stop()
            self.lblm2.setPixmap(self.pixmap2)
            self.unsetCursor()
            self.lbl1.setText("Done update")
        except subprocess.CalledProcessError, e:
            print e.output

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    test = Test()
    test.show()
    sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:2)

使用QProcess而不是subprocess.Popen,使用select_related()允许在使用finished信号完成流程时进行回调:

def get_updates(self):
    self.lbl1.setText("Updating")
    self.lblm2.setMovie(self.movie)
    self.movie.start()
    self.setCursor(QtCore.Qt.BusyCursor)

    self.p1 = QProcess()
    self.p1.finished.connect(self.on_apt_update_finished)
    self.p1.start('apt', ['update'])

def on_apt_update_finished(self, exit_code, exit_status):
    self.movie.stop()
    self.lblm2.setPixmap(self.pixmap2)
    self.unsetCursor()
    self.lbl1.setText("Done update")