在Spotfire中执行脚本时使用进度条触发SystemError问题求助
问题分析与解决
错误原因
你遇到的 SystemError 是因为 Document.Data.Tables.ReloadAllData() 执行时会自动创建一个文档事务,而在事务的上下文环境中,Spotfire不允许执行进度条相关操作(比如ExecuteSubtask),两者的上下文冲突导致报错。
修复方案
需要将进度条的更新操作放在文档事务之外,调整操作顺序,确保进度提示与数据刷新的逻辑不重叠在事务上下文里。以下是修正后的代码:
from Spotfire.Dxp.Framework.ApplicationModel import * import traceback, time proc = Application.GetService[ProgressService]() def ex(): try: # 先提示开始刷新,此时还未进入事务 proc.CurrentProgress.ExecuteSubtask("开始刷新数据") time.sleep(2) # 演示用,实际可移除 # 执行数据刷新,此操作会自动开启事务,但此时不再调用进度操作 Document.Data.Tables.ReloadAllData() # 刷新完成后,回到事务外提示完成 proc.CurrentProgress.ExecuteSubtask("数据刷新完成") time.sleep(2) except: traceback.print_exc() proc.ExecuteWithProgress("手动刷新数据", "正在刷新所有数据表", ex)
如果需要更精细的事务控制(比如自定义事务边界),也可以手动使用TransactionManager:
from Spotfire.Dxp.Framework.ApplicationModel import * from Spotfire.Dxp.Application import TransactionManager import traceback, time proc = Application.GetService[ProgressService]() def ex(): try: proc.CurrentProgress.ExecuteSubtask("准备刷新数据") time.sleep(2) # 手动开启并管理事务,确保进度操作在事务外执行 with TransactionManager.CreateTransaction(Document, "刷新数据") as transaction: Document.Data.Tables.ReloadAllData() transaction.Commit() proc.CurrentProgress.ExecuteSubtask("数据刷新完成") time.sleep(2) except: traceback.print_exc() proc.ExecuteWithProgress("手动刷新数据", "正在刷新所有数据表", ex)
关键注意点
- 所有
CurrentProgress.ExecuteSubtask()调用必须放在文档事务的外部,包括事务启动前和提交/回滚后。 ReloadAllData()本身会隐式创建事务,无需手动开启,除非你需要自定义事务的名称或边界。
内容的提问来源于stack exchange,提问作者Zegher V
相关产品推荐
相关产品推荐

