以下是代码:
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方法,它将闪烁绿色并回到无聊状态。
它在调试模式下完美运行。
但是,当它正常运行时,分析仪正在分析条形图时没有做任何事情。一旦它完成,程序似乎终于记住它应该用进度条做一些事情并且它闪烁绿色,就像我想要的那样。
有没有办法让这些东西同时成为人们关注的焦点?
答案 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