如何通过调用另一个函数的QThread更新PyQT中的Progressbar



我对PyQT很陌生。我正在学习如何制作Progressbar,并随着算法的进展进行更新。我已经能够制作一个基本进度条,使用这个链接更新自己:Python-pyqt带多线程的脉冲进度条

问题是,我需要为我的算法做同样的事情,而该算法有一个不同的函数,不能写在QThread的run函数中。

这是我为QThread类编写的代码,(与上面链接中给出的相同(

class External(QThread):
countChanged = pyqtSignal(int)

def run(self):
count = 0 
while count < 100:
count += 1
time.sleep(1)
self.countChanged.emit(count)

这是我的Progressbar,的代码

def generate_timetable(self):
self.calc = External() 
self.calc.countChanged.connect(self.onCountChanged)
self.calc.start()

def onCountChanged(self, value):
self.ui.progressBar.setValue(value)

现在,这是我的算法函数的伪代码(这个函数将基本上取代time.sleep(1)函数(

def algorithm():
fh = False
best_solution = None
count = 1 
best_fitness = 100000 # any huge number  
while fh is False:
fh = True
solution, solution_fitness = another_function() 
if solution_fitness < best_fitness:
best_solution = solution 
best_fitness = solution_fitness 
fh = False

print("ITERATION #", count, " is OVER!")
print("Best Solution FItness: ", best_fitness)
count += 1 

return best_solution, best_fitness

我需要做的是,在每次迭代后,我的Thread类都会发出一个信号,最佳解决方案的适应度值会打印在我的主GUI上(我有一个标签(,Progressbar的值也会更新(假设我希望它只更新1个计数,就像在当前程序中一样(

然而,问题是,我无法在一次迭代后返回适应度值,因为如果我这样做,我的算法将需要重新启动,因此我将失去进度。但是,如果不从函数返回值,我不知道我怎么可能知道一次迭代已经结束,所以现在发出信号,更新进度条值,并将标签值设置为迭代后计算的适应度值。

有人能指导我吗?或者给我看任何类似的项目。

我认为只需将信号从pyqtSignal(int)更改为pyqtSignal(int, int),然后在算法循环self.countChanged.emit(count, best_fitness)中,就可以得到您想要的信号。如果你想让它们分开,你也可以定义第二个健身信号。

相关内容

  • 没有找到相关文章

最新更新