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

2024-10-01 05:02:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着在调用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_())

Tags: importselfsysh2moviegifsubprocesspopen
1条回答
网友
1楼 · 发布于 2024-10-01 05:02:54

不要使用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")

相关问题 更多 >