Python:如何实时获取函数调用的执行结果?
嘿,我看你想实时拿到循环里每一个i的结果,而不是等循环跑完只拿到最后那个值对吧?先给你提个代码里的小坑:你的func方法把return i放在了循环里面,这会导致函数第一次循环就直接退出,根本跑不到后面的i,只能拿到i=0,这肯定不是你要的效果~
下面给你几个实用的解决方案,你可以根据自己的场景选:
方案1:用生成器实时返回值
生成器天生就是用来逐个输出序列值的,非常适合这种场景。只需要把return改成yield,就能让函数每次循环都返回当前的i值,而不是直接退出:
import threading class model(object): """docstring for model""" def __init__(self): pass def func(self): for i in range(1000): print('i', i) yield i # 用yield替代return,每次迭代返回当前i class WorkThread(threading.Thread): def __init__(self): # 注意你之前写的是__int__,这里要改成__init__哦 super(WorkThread, self).__init__() def run(self): model1 = model() # 迭代生成器,逐个获取实时的i值 for result in model1.func(): # 这里可以写你处理每个i的逻辑,比如更新日志、UI等 print("实时拿到的i值:", result) # 启动线程测试 t = WorkThread() t.start() t.join()
方案2:用回调函数传递结果
如果需要把实时结果交给外部的处理逻辑,可以让func接收一个回调函数,每次循环时调用这个函数把i传出去:
import threading class model(object): """docstring for model""" def __init__(self): pass def func(self, callback): for i in range(1000): print('i', i) callback(i) # 调用回调函数,实时传递i值 # 定义处理实时结果的回调函数 def handle_result(i): print("通过回调拿到的i值:", i) # 这里可以扩展成你需要的逻辑,比如写入文件、更新界面等 class WorkThread(threading.Thread): def __init__(self): super(WorkThread, self).__init__() def run(self): model1 = model() model1.func(handle_result) # 传入回调函数 t = WorkThread() t.start() t.join()
方案3:PyQt信号与槽(适合GUI场景)
看你代码里注释了trigger = pyqtSignal(),应该是在PyQt环境下开发,那用信号发射的方式最稳妥——毕竟PyQt里跨线程更新UI只能用信号槽,不然会出问题:
from PyQt5.QtCore import QThread, pyqtSignal import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel class model(object): """docstring for model""" def __init__(self): pass def func(self, signal): for i in range(1000): print('i', i) signal.emit(i) # 发射信号,把i值传递出去 class WorkThread(QThread): # 定义一个传递int类型参数的信号 update_signal = pyqtSignal(int) def __init__(self): super(WorkThread, self).__init__() def run(self): model1 = model() model1.func(self.update_signal) class MainWindow(QWidget): def __init__(self): super().__init__() self.label = QLabel("当前i值:", self) self.label.move(20,20) self.init_thread() def init_thread(self): self.thread = WorkThread() # 绑定信号与槽函数,实时更新UI self.thread.update_signal.connect(self.update_label) self.thread.start() def update_label(self, i): self.label.setText(f"当前i值:{i}") if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.resize(200, 100) window.show() sys.exit(app.exec_())
内容的提问来源于stack exchange,提问作者rosefun
相关产品推荐
相关产品推荐

