我对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)
中,就可以得到您想要的信号。如果你想让它们分开,你也可以定义第二个健身信号。