Matplotlib循环绘图等待用户输入的解决方案求助(JupyterLab环境)
解决方案
前置配置
首先执行以下命令安装交互式后端依赖:
pip install ipympl
安装完成后重启JupyterLab内核,在你的Notebook开头运行一行魔法命令,切换Matplotlib的交互式后端,解决绘图和循环输入的冲突问题:
%matplotlib widget
这个后端支持绘图实时渲染,不会阻塞后续的用户输入逻辑,是你当前场景下成本最低的适配方案。
核心代码修改
你原有代码只需要调整3处即可实现需求:
- 修正plot方法的参数拼写错误,原代码的
bakcground_windows为笔误,改为background_windows - 每次绘图后调用
plt.show()确保画布渲染完成 - 用户确认后调用
plt.close()关闭当前画布,避免多轮循环的图堆叠
修改后的代码如下:
import matplotlib.pyplot as plt from copy import deepcopy def set_background(self): """ 该方法用于让用户自定义每个元素的背景参数,后续处理同成分的多幅粒子图像时可直接调用保存的背景参数 可扩展为点击交互功能,实现点击选择背景区域 """ self.Background_tree = {} elements_in_sample = deepcopy(self.Data.metadata.Sample['elements']) Xray_in_sample = self.weighted_Xray_line_list data_sample = deepcopy(self.Data) integration_window = 1.3 for element in elements_in_sample: data_sample.set_elements(elements=[element]) for xray_line in (self.Data.metadata.Sample["xray_lines"]): if element in xray_line: data_sample.set_lines([xray_line]) # 循环等待用户输入有效参数,直到确认接受 while True: background_points = input('请输入背景点,用空格分隔:').split(' ') background_window = list(map(float,background_points)) bw = data_sample.estimate_background_windows(background_window) iw = data_sample.estimate_integration_windows(integration_window) data_sample.sum().plot(True, background_windows=background_window) plt.show() happy = input('是否接受当前结果?输入y确认,输入其他字符重新调整:') plt.close() if happy.lower() == 'y': self.Background_tree[element+"_"+xray_line] = bw break
可选优化:绑定Matplotlib按键事件(无需手动输入字符)
如果不想每次都在输入框敲y/n,可以给画布绑定按键响应,按Y键确认,按N键重新输入,将循环内的逻辑替换为以下代码即可:
while True: background_points = input('请输入背景点,用空格分隔:').split(' ') background_window = list(map(float,background_points)) bw = data_sample.estimate_background_windows(background_window) iw = data_sample.estimate_integration_windows(integration_window) data_sample.sum().plot(True, background_windows=background_window) fig = plt.gcf() confirm = None # 定义按键响应函数 def on_key(event): nonlocal confirm if event.key.lower() == 'y': confirm = True plt.close() elif event.key.lower() == 'n': confirm = False plt.close() fig.canvas.mpl_connect('key_press_event', on_key) plt.show(block=True) # 阻塞等待按键触发 if confirm: self.Background_tree[element+"_"+xray_line] = bw break
内容的提问来源于stack exchange,提问作者asger rosenkranz
相关产品推荐
相关产品推荐

