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

3

我对PyQT还很陌生。正在学习如何制作进度条并在算法进展时更新它。我已经能够使用这个链接制作一个基本的进度条, 并实现了自我更新: 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 class)发出一个信号,并将最佳解决方案的适应度值打印在主GUI上(我有一个标签用于显示此信息),同时更新进度条的值(假设我只想更新一次计数,就像当前程序所做的那样)。
然而问题在于,如果我在一次迭代之后返回适应度值,我的算法将需要重新启动,因此我将失去进展。但是如果不从函数中返回值,我不知道如何确定一次迭代是否结束,以便发出信号、更新进度条值并将标签值设置为迭代后计算得到的适应度值。
有人可以指导我吗?或者展示给我任何具有类似功能的项目。
1个回答

1

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


哦!这太简单了。非常感谢你! - Sakib Khan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接