如何通过调用另一个函数的QThread更新PyQT中的Progressbar
How to update Progressbar in PyQT through QThread which calls another function
我对 PyQT 很陌生。我正在学习如何制作 Progressbar 并随着算法的进展对其进行更新。我已经能够制作一个使用此 link 进行自我更新的基本进度条:
问题是,我需要对我的算法做同样的事情,而那个算法有不同的功能,不能写在 QThread 的 run
函数中。
这是我的 QThread 代码 class,(与上面给出的相同 link)
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
我需要做的是在每次迭代后,我的线程 class 发出一个信号,并且最佳解决方案的适应度值打印在我的主 GUI 上(我有一个标签)并且 Progressbar 的值也是已更新(假设我希望它仅更新 1 个计数,就像在当前程序中所做的那样)
然而,问题是我不能 return 一次迭代后的适应度值,因为如果我这样做,我的算法将需要重新启动,因此我将失去我的进步。但是如果没有 return 函数的值,我不知道我怎么可能知道一次迭代已经结束所以现在发出信号,更新进度条值并将标签值设置为计算出的适应度值迭代后。
任何人都可以指导我吗?或向我展示任何与此类似的项目。
我认为您只需将信号从 pyqtSignal(int)
更改为 pyqtSignal(int, int)
,然后在您的算法循环中 self.countChanged.emit(count, best_fitness)
即可获得您想要的结果。如果您希望它们分开,您还可以为健身定义第二个信号。
我对 PyQT 很陌生。我正在学习如何制作 Progressbar 并随着算法的进展对其进行更新。我已经能够制作一个使用此 link 进行自我更新的基本进度条:
问题是,我需要对我的算法做同样的事情,而那个算法有不同的功能,不能写在 QThread 的 run
函数中。
这是我的 QThread 代码 class,(与上面给出的相同 link)
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
我需要做的是在每次迭代后,我的线程 class 发出一个信号,并且最佳解决方案的适应度值打印在我的主 GUI 上(我有一个标签)并且 Progressbar 的值也是已更新(假设我希望它仅更新 1 个计数,就像在当前程序中所做的那样)
然而,问题是我不能 return 一次迭代后的适应度值,因为如果我这样做,我的算法将需要重新启动,因此我将失去我的进步。但是如果没有 return 函数的值,我不知道我怎么可能知道一次迭代已经结束所以现在发出信号,更新进度条值并将标签值设置为计算出的适应度值迭代后。
任何人都可以指导我吗?或向我展示任何与此类似的项目。
我认为您只需将信号从 pyqtSignal(int)
更改为 pyqtSignal(int, int)
,然后在您的算法循环中 self.countChanged.emit(count, best_fitness)
即可获得您想要的结果。如果您希望它们分开,您还可以为健身定义第二个信号。