【问题标题】:Detect which figure was closed with Matplotlib检测使用 Matplotlib 关闭的图形
【发布时间】:2015-06-26 09:16:15
【问题描述】:

我在使用 qt4 后端的 GUI 应用程序中嵌入 matplotlib。

我需要存储用户绘制并保持打开状态的图形列表,即多个图形可以通过不同的点击绘图按钮分别绘制。

但是,当用户关闭一个图形时,我需要将其从图形列表中删除。

如何判断哪个图形是闭合的?

我正在使用事件处理程序来检测已关闭的图形,但我不知道是哪一个。

这是一些简单的示例代码:

from __future__ import print_function
import matplotlib.pyplot as plt
import numpy as np

figs = []
figNum = len(figs)

def handle_close(evt):
    evt.canvas.figure.axes[0].has_been_closed = True
    print ('Closed Figure')

fig = plt.figure()
figs.append(fig)


ax = figs[figNum].add_subplot(1, 1, 1)
ax.has_been_closed = False
# fig2 = plt.figure()
# ax2 = fig2.add_axes([0.15, 0.1, 0.7, 0.3])

t = np.arange(0.0, 1.0, 0.01)
s = np.sin(2*np.pi*t)
line, = ax.plot(t, s, color='blue', lw=2)


# fig2 = plt.figure()
# figs.append(fig2)
# fig2.canvas.mpl_connect('close_event', handle_close)
fig.canvas.mpl_connect('close_event', handle_close)

plt.show()
print (ax.has_been_closed)

【问题讨论】:

  • 如果您要嵌入,我建议 使用 pyplot 并自己进行图形状态管理。然后,您可以使用标准的 qt 信号/插槽来处理这类事情。
  • @tcaswell:您是否建议创建一个列表并将数字编号附加到列表中?如果是这样,那么在关闭图形时,如果我自己管理它,我怎么知道要从列表中弹出哪个图形编号或标签?
  • qt窗口关闭信号

标签: python matplotlib


【解决方案1】:

传递给您的处理程序的evt 有一个成员canvas,而后者又有一个成员figure,这当然是事件所指的数字。

因此,如果您想从列表中删除该数字,则可以这样做

figs.remove(evt.canvas.figure)

如果你想得到图号,你访问

evt.canvas.figure.number

你可以从

那里得到名字
evt.canvas.figure._label

但是,领先的 _ 可能意味着您不应该依赖它。

【讨论】:

  • 欢迎来到 SO。通常,解释您的答案而不仅仅是添加链接被认为是一种很好的做法。可以参考this guide
  • @Daniel 你能解释一下如何使用它来返回数字名称/编号或某种关于哪个数字已关闭的参考,即可能有多个数字打开
  • @RicDavimes:我希望这能让答案更清楚。如果没有,请更新您的问题,以便我们了解您到底遇到了什么问题。
  • @DanielSk 非常感谢。这就是我要找的。文档中不完全清楚
猜你喜欢
  • 1970-01-01
  • 2021-07-04
  • 2018-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
相关资源
最近更新 更多