Python matplotlib和x27的Can阻塞;s mainloop是否仅限于一个窗口/图形?--即,fig.show(blocking=True)

Python matplotlib和x27的Can阻塞;s mainloop是否仅限于一个窗口/图形?--即,fig.show(blocking=True),python,matplotlib,interactive,Python,Matplotlib,Interactive,我有一个图像(2+1)D阵列的时间历史记录,我使用ipython对其进行了不同的切片和检查,每个视图都是matplotlib图 我有一个自定义类,它使用matplotlib小部件(特别是一个滑块)允许一个交互式窗口打开并按滑块选择的帧查看图像。小部件工作正常,但使用plt.show()命令进行阻止,在我完成小部件之前,这也是正常的 为了将控制传递回ipython命令行,我必须关闭所有matplotlib图形——我希望只能关闭与小部件关联的窗口。有什么方法可以启用此功能吗? 类似于fig.show

我有一个图像(2+1)D阵列的时间历史记录,我使用
ipython
对其进行了不同的切片和检查,每个视图都是matplotlib图

我有一个自定义类,它使用matplotlib小部件(特别是一个滑块)允许一个交互式窗口打开并按滑块选择的帧查看图像。小部件工作正常,但使用
plt.show()
命令进行阻止,在我完成小部件之前,这也是正常的

为了将控制传递回ipython命令行,我必须关闭所有matplotlib图形——我希望只能关闭与小部件关联的窗口。有什么方法可以启用此功能吗?
类似于
fig.show(blocking=True)
的内容将是我想象中想要的,也就是说,限制GUI mainloop的阻塞,使其仅查找该窗口的plt.close(),但目前似乎没有实现

@非常重要,谢谢你的回复。我已经添加了用于查看器小部件的代码。要初始化对象,只需提供一个[frames(t),y,x]值的3D数组。i、 e

randomData=np.random.rand((5,5,5))


您的
滑块
实例正在被垃圾收集,因为您没有保留对它的引用

从:

要使滑块保持响应,必须保持对其的引用


在这种情况下,
self.slider=slider(…)
而不是
slider=slider(…)

使用IPython,您应该能够完全在交互模式下工作,而不会阻塞任何内容。如果我不阻塞,那么GUI将无法与slider小部件交互并允许重新绘制图像。i、 例如,将
plt.show()
更改为
fig.show()
可以消除GUI功能。如果您能提供问题的详细信息,我很乐意对此进行进一步研究。但要回答您最初的问题:不,pyplot不可能实现部分阻塞。为小部件添加了代码。感谢您提供的任何见解,请确保保留您创建的实例。例如,
self.slider=slider(…)
而不是
slider=slider(…)
。这确保了即使函数由于非阻塞行为而返回,您的
Slider
实例也不会被垃圾收集。根据您的建议将plt.show()更改为fig.show(),并按照我的要求工作。谢谢
class showFrames(object):
def __init__(self, timeData):
    self.data = timeData   # 3D array of t, y, x values
    self.fig, self.ax = plt.subplots(1)
    self.im = None
    self.frameStr = None
    self.start()

def start(self):
    # initialize GUI
    Tmin = self.data.min()
    Tmax = self.data.max()
    frameInit = self.data.shape[0] - 1
    self.im = self.ax.imshow(self.data[frameInit])
    self.im.set_clim(Tmin, Tmax)
    self.fig.colorbar(self.im)
    self.frameStr = self.ax.text(0.1, 0.1, '', transform=self.ax.transAxes, color='white')
    axis_color = 'yellow'
    # Add frame and radius slider for tweaking the parameters
    frame_slider_ax  = self.fig.add_axes([0.25, 0.05, 0.65, 0.03], axisbg=axis_color)
    frame_slider = Slider(frame_slider_ax, 'Frame', 0, frameInit, valinit=frameInit)
    frame_slider.on_changed(self.frame_slider_on_changed)
    plt.show()

def frame_slider_on_changed(self, i):
    self.im.set_data(self.data[int(i)])
    self.frameStr.set_text(str(int(i)))
    self.fig.canvas.draw_idle()