gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:43:20 27 4
gpt4 key购买 nike

我对 PyQT 很陌生。我正在学习如何制作 Progressbar 并随着算法的进展对其进行更新。我已经能够制作一个使用此链接进行 self 更新的基本进度条:Python pyqt pulsing progress bar with multithreading

问题是,我需要对我的算法做同样的事情,而那个算法有不同的功能,不能写在 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)

这是我的进度条的代码,

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)。如果您希望它们分开,您还可以为健身定义第二个信号。

关于multithreading - 如何通过调用另一个函数的QThread更新PyQT中的Progressbar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71865013/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com