Taipy中invoke_long_callback使用求助:长回调参数传递与线程报错
问题场景
按钮代码:
<|INICIAR|button|on_action={on_iniciar_ini}|id=btn01|>
初始回调实现:
def on_iniciar_ini(state, id, action): notify(state, "info", "Heavy task started...") invoke_long_callback(state, on_iniciar, [...heavy_function arguments...]) def on_iniciar(state, id, action): C4=state.Jiga.Status_AI0() # 关联下拉框值 C3=state.Jiga.Status_AI1() # 关联下拉框值 ...更多业务代码
调用invoke_long_callback(state, on_iniciar, [])时触发错误:
TaipyGuiWarning: invoke_long_callback(): Exception raised in function on_iniciar(). on_iniciar() missing 3 required positional arguments: 'state', 'id', and 'action'
修改代码后:
def on_iniciar_ini(state, id, action): notify(state, "info", "Heavy task started...") invoke_long_callback(state,on_iniciar(state)) #invoke_long_callback(state, on_iniciar, []) def on_iniciar(state): C4=state.Jiga.Status_AI0() C3=state.Jiga.Status_AI1() # 关联下拉框值 ...更多业务代码
运行后出现线程异常:
Exception in thread Thread-64 (user_function_in_thread): Traceback
(most recent call last): File
"C:\Users\jaime.rodriguez\MULTELETRONIC\SoftJigas\PP000938_SoftJig.venv\lib\site-packages\taipy\gui\gui_actions.py",
line 341, in user_function_in_thread
res = user_function(*uf_args) TypeError: 'NoneType' object is not callable
During handling of the above exception, another exception occurred:
Traceback (most recent call last): File "C:\Program
Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\threading.py",
line 1016, in _bootstrap_inner
self.run() File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\lib\threading.py",
line 953, in run
self._target(*self._args, **self._kwargs) File "C:\Users\jaime.rodriguez\XXXX\XXXX\PP000938_SoftJig.venv\lib\site-packages\taipy\gui\gui_actions.py",
line 344, in user_function_in_thread
callback_on_status(False, e, user_function.name) AttributeError: 'NoneType' object has no attribute 'name'. Did you
mean: 'ne'?
正确解决方案
1. 核心规则梳理
invoke_long_callback第二个参数必须是函数引用,不能直接执行函数(比如on_iniciar(state)会立即执行并返回None,导致Taipy调用空对象报错)state由Taipy自动注入到长时任务函数中,不需要手动传入参数列表- 长时任务函数不需要
id和action参数(除非你主动传递),因为invoke_long_callback不会自动传递按钮的这两个属性
2. 修正后完整代码
按钮代码保持不变:
<|INICIAR|button|on_action={on_iniciar_ini}|id=btn01|>
回调函数调整为:
def on_iniciar_ini(state, id, action): notify(state, "info", "Heavy task started...") # 正确调用:传入函数引用,空参数列表(state由Taipy自动注入) invoke_long_callback(state, on_iniciar, []) def on_iniciar(state): # 直接通过state获取所需值 C4 = state.Jiga.Status_AI0() C3 = state.Jiga.Status_AI1() # ...你的长时业务逻辑代码
3. 扩展场景:传递额外参数
如果需要把按钮的id/action或其他值传入长时任务,可手动添加到参数列表:
def on_iniciar_ini(state, id, action): notify(state, "info", "Heavy task started...") # 将id和action传入参数列表 invoke_long_callback(state, on_iniciar, [id, action]) def on_iniciar(state, btn_id, btn_action): # 使用传入的额外参数 print(f"触发任务的按钮ID:{btn_id}") C4 = state.Jiga.Status_AI0() C3 = state.Jiga.Status_AI1() # ...业务代码
4. 注意事项
- 长时任务中修改
state对象会自动同步到前端UI,无需额外操作 - 若长时任务需要返回结果,可结合
callback_on_status参数处理(参考Taipy官方文档逻辑)
内容的提问来源于stack exchange,提问作者Jaime Rodriguez

