Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在进行Popen调用时保持gui的响应性?_Python_Python 2.7_Pyqt_Pyqt4 - Fatal编程技术网

Python 如何在进行Popen调用时保持gui的响应性?

Python 如何在进行Popen调用时保持gui的响应性?,python,python-2.7,pyqt,pyqt4,Python,Python 2.7,Pyqt,Pyqt4,我试图在调用Popen命令时播放一个throbber(以动画追逐箭头gif的形式),但它不起作用,因为我认为在Popen命令运行时gui完全没有响应。我怎样才能解决这个问题? 请检查我下面的代码 import subprocess import os import sys from PyQt4 import QtCore, QtGui class Test(QtGui.QDialog): def __init__(self, parent=None): super(T

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

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_())

不要使用
subprocess.Popen
,而是在进程结束时使用允许回调的
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")

精彩的回答!不知道为什么我不能对Popen执行同样的操作,但这是一个完美的选择。@answerSeeker,您可以使用
subprocess.Popen
,但它需要另一个线程来等待子进程完成,这很麻烦。