gpt4 book ai didi

python - 如何在进行 Popen 调用时保持 gui 的响应能力?

转载 作者:行者123 更新时间:2023-12-01 03:18:27 24 4
gpt4 key购买 nike

我试图在调用 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,而是使用 QProcess允许在进程完成时使用 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")

关于python - 如何在进行 Popen 调用时保持 gui 的响应能力?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42239240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com