在Maestro内置Python Shell调用轨迹帧切换方法报错求助
解决Maestro中模拟点击“下一轨迹帧”按钮的报错问题
问题原因
你直接通过类名调用TrajectoryPlayer.takeTrajectoryStep(),但takeTrajectoryStep是实例方法:
- 必须通过
TrajectoryPlayer的实例调用,而非类本身调用(否则会缺少self参数) - 该方法还需要传入当前帧
curr_frame参数,你没有提供导致报错
正确解决方案
Maestro加载轨迹后,界面中已经存在TrajectoryPlayer实例,我们只需要找到这个实例,调用它的onNextButtonClicked()方法(这是“下一帧”按钮的点击回调,内部已经处理了帧切换的逻辑):
from schrodinger.trajectory.trajectory_gui_dir.playertoolbar import TrajectoryPlayer from schrodinger.ui.qt.appframework.app import get_app # 获取当前Maestro应用实例 app = get_app() trajectory_player = None # 遍历所有界面组件,找到轨迹播放器实例 for widget in app.allWidgets(): if isinstance(widget, TrajectoryPlayer): trajectory_player = widget break if trajectory_player: # 模拟点击“下一轨迹帧”按钮 trajectory_player.onNextButtonClicked() else: print("错误:未找到轨迹播放器,请先在Maestro中加载Desmond轨迹文件")
循环切换轨迹帧
如果需要循环执行切换操作,直接添加循环结构即可,比如循环切换20次:
from schrodinger.trajectory.trajectory_gui_dir.playertoolbar import TrajectoryPlayer from schrodinger.ui.qt.appframework.app import get_app import time app = get_app() trajectory_player = None for widget in app.allWidgets(): if isinstance(widget, TrajectoryPlayer): trajectory_player = widget break if trajectory_player: # 循环切换20次,每次间隔0.5秒(可根据需求调整) for _ in range(20): trajectory_player.onNextButtonClicked() time.sleep(0.5) else: print("错误:未找到轨迹播放器,请先加载轨迹文件")
额外说明
onNextButtonClicked()是Maestro轨迹播放器“下一帧”按钮的原生回调方法,和手动点击按钮效果完全一致- 如果一定要用
takeTrajectoryStep(),需要先获取当前帧再调用:if trajectory_player: curr_frame = trajectory_player.getCurrentFrame() trajectory_player.takeTrajectoryStep(curr_frame)
内容的提问来源于stack exchange,提问作者THolmes
相关产品推荐
相关产品推荐

