在os.system调用后,GUI冻结

时间:2014-01-05 20:40:33

标签: python pyqt4

我的问题在于os.system。在完成格式化之前,GUI冻结,我无法修复它。

class ImageDialog(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        self.ui = uic.loadUi("Recursos/main.ui",self) 
        self.connect(self.ui.proteger_Button, QtCore.SIGNAL("clicked()"),self,
                     QtCore.SLOT("protec()"))

    @QtCore.pyqtSlot()
    def protec(self):
        self.USB = "G:"
        comando = "format %s /fs:ntfs /q /v:test /y" %(self.USB)
        os.system(comando)`

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)

    window = ImageDialog()
    window.show()

    sys.exit(app.exec_())       

1 个答案:

答案 0 :(得分:2)

您的案例中最简单的解决方法是添加:

from threading import Thread

到您的导入列表,然后:

@QtCore.pyqtSlot()
def protec(self):
    self.USB = "G:"
    comando = "format %s /fs:ntfs /q /v:test /y" %(self.USB)
    t = Thread(target = lambda: os.system(comando))
    t.start()

这样,GUI线程就不会等待外部进程完成。

您可能记住t的值并以某种方式管理它,因此运行的线程数不会无限制地增加,以防外部命令挂起,或者跑了很长时间。

请注意,这不是处理外部进程的好方法。建议使用subprocess模块。