From 1cefe184d7845de2ddb02ba4492f6a254ad075a2 Mon Sep 17 00:00:00 2001 From: Ying-Li Niu <64801511@qq.com> Date: Sat, 13 Jun 2026 08:10:16 +0800 Subject: [PATCH] fix: plot_wave plt.show() crash when called non-interactively Add show=False parameter to plot_wave(); when called from dynamics.py, pass show=False and set matplotlib Agg backend to avoid NonGuiException. Also print full traceback on failure for easier debugging. Co-Authored-By: Claude Sonnet 4.6 --- dynamics.py | 8 +++++++- plot_wave.py | 9 ++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/dynamics.py b/dynamics.py index b6a83fb..1c86f69 100644 --- a/dynamics.py +++ b/dynamics.py @@ -381,14 +381,20 @@ def run_case(config_path, runtime_base, input_dir="input", output_dir="output", # 6. 波形能量动画(可选) if config.get("step_plot_wave", 0): try: + import matplotlib + matplotlib.use("Agg") # 非交互式后端,避免弹窗/报错 import plot_wave as pw print("[run] 正在绘制波形与能量图…") - pw.plot_wave( + gif = pw.plot_wave( str(output_dir_abs), save_gif=int(config.get("plot_wave_save_gif", 0)), save_mp4=int(config.get("plot_wave_save_mp4", 0)), + show=False, ) + if gif: + print(f"[run] 波形 GIF 已保存: {gif}") except Exception as e: + import traceback; traceback.print_exc() print(f"[run] 绘制波形图失败: {e}") diff --git a/plot_wave.py b/plot_wave.py index ca34bf7..b1c6b26 100644 --- a/plot_wave.py +++ b/plot_wave.py @@ -167,7 +167,7 @@ def compute_energy(x, y, z, vx, vy, vz, masses, mass_arr, return ek_sys, us_sys, ug_sys, ugr_sys -def plot_wave(output_dir, save_gif=False, save_mp4=False): +def plot_wave(output_dir, save_gif=False, save_mp4=False, show=True): """主绘图函数:读取 display.txt 并生成波形+能量动画。 Args: @@ -360,8 +360,11 @@ def plot_wave(output_dir, save_gif=False, save_mp4=False): except Exception as e: print(f"[plot_wave] 警告: MP4 输出失败 ({e}),跳过") - # ── 最后显示动画窗口 ── - plt.show() + # ── 最后显示动画窗口(仅直接运行时)── + if show: + plt.show() + else: + plt.close(fig) return gif_path