可以将matplotlib的mainloop的阻塞限制为单个窗口/图形吗?-即,图show(blocking = True)

问题描述 投票:1回答:1

我有一个图像(2 + 1)D数组的时间历史记录,我将其切成薄片并使用ipython进行检查,每个视图都是一个matplotlib图形。

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

为了使控制权传递回ipython命令行,我必须关闭所有matplotlib图形-我希望只能关闭与小部件关联的窗口。有启用该功能的方法吗?我想像的是fig.show(blocking=True)之类的东西,即将GUI主循环的阻塞限制为仅查找该窗口的plt.close(),但目前似乎尚未实现。

@@ ImportanceOfBeingEarnest,感谢您的回复。我已经添加了用于查看器小部件的代码。要初始化对象,您只需要提供[frames(t),y,x]值的3D数组即可。即

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

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()
python matplotlib interactive
1个回答
1
投票

您的Slider实例正在被垃圾回收,因为您没有保留对其的引用。

Slider documentation

为了使滑块保持响应状态,您必须保留对其的引用。

在这种情况下,以Slider代替self.slider=Slider(...)

© www.soinside.com 2019 - 2024. All rights reserved.