我想将一个小部件的状态与运行的子进程并行更新

时间:2016-01-29 15:27:56

标签: python subprocess pyqt4

以下是代码:

def run_analyzer(self, analyzer, filename):
    is_set_to_zero = False

    p = subprocess.Popen([analyzer, filename], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

    line_iterator = iter(p.stdout.readline, b"")
    for line in line_iterator:
        is_set_to_zero = self.progBar(str(line), is_set_to_zero)  

def progBar(self, text, set_to_zero):

    if set_to_zero == False:
        self.core_progress_bar.setMinimum(0)
        self.core_progress_bar.setMaximum(0)
        return True

    if 'DONE' in text:
        self.core_progress_bar.setRange(0, 100)
        self.core_progress_bar.setValue(100)
        time.sleep(0.5)
        self.core_progress_bar.reset()

这背后的整个想法是让进度条处于“繁忙”状态,而分析仪正在做它的事情。一旦最后一行(包括单词DONE)已经传递给progBar方法,它将闪烁绿色并回到无聊状态。

它在调试模式下完美运行。

但是,当它正常运行时,分析仪正在分析条形图时没有做任何事情。一旦它完成,程序似乎终于记住它应该用进度条做一些事情并且它闪烁绿色,就像我想要的那样。

有没有办法让这些东西同时成为人们关注的焦点?

1 个答案:

答案 0 :(得分:1)

QT在你的方法循环中不会更新你的gui,你必须将该循环移动到继承QtCore.QThread的类并创建/连接自定义信号到该线程,这将更新你的进度条< / p>

这里的一些例子:

class Progress(QtCore.QThread):
    def __init__(self):
        QtCore.QThread.__init__(self)
    def run():
        p = subprocess.Popen([analyzer, filename], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

        line_iterator = iter(p.stdout.readline, b"")
        for line in line_iterator:
            self.emit( QtCore.SIGNAL('__updateProgressBar(int)', yourPercentNumber))


class YourMainClass:
    #blabla...
    self.progressThread = Progress()
    self.connect(self.progressThread, QtCore.SIGNAL("__updateProgressBar(int)"), self.progBar)

    @QtCore.Slot(int)
    def progBar(percent):
        #blabla