Python 如果最后一个打开的图形关闭,如何使plt.pause()工作

Python 如果最后一个打开的图形关闭,如何使plt.pause()工作,python,python-3.x,matplotlib,tkinter,Python,Python 3.x,Matplotlib,Tkinter,我试图在python 3脚本中创建一组matplotlib图形。脚本无限运行,并根据用户的输入绘制内容。我需要在一些脚本中使用plt.pause(),因为time.sleep()在我的情况下不起作用 我似乎遇到了一个问题,用户可以关闭除上一个创建的图形之外的任何图形。例如,假设用户创建了3个数字。如果脚本位于plt.pause中,并且用户关闭了图1或图2,则一切正常。但是,如果用户仅关闭图#3,脚本就会崩溃,我会得到一个错误:_tkinter.TclError:无法调用“update”命令:应用

我试图在python 3脚本中创建一组matplotlib图形。脚本无限运行,并根据用户的输入绘制内容。我需要在一些脚本中使用plt.pause(),因为time.sleep()在我的情况下不起作用

我似乎遇到了一个问题,用户可以关闭除上一个创建的图形之外的任何图形。例如,假设用户创建了3个数字。如果脚本位于plt.pause中,并且用户关闭了图1或图2,则一切正常。但是,如果用户仅关闭图#3,脚本就会崩溃,我会得到一个错误:_tkinter.TclError:无法调用“update”命令:应用程序已被销毁

我需要使用tkagg后端,因为我正在使用tkinter

下面是一个演示该问题的简短脚本。如果脚本位于plt.pause()中,并且关闭最后创建的图形,则会出现错误

import matplotlib;
matplotlib.use("tkagg");
import matplotlib.pyplot as plt;

fig1 = plt.figure();
plt.pause(2);
plt.show(block=False);

fig2 = plt.figure();
plt.pause(2);
plt.show(block=False);

fig3 = plt.figure();
plt.pause(2);
plt.show(block=False);

input("done");
有没有办法使plt.pause()不依赖于最后打开的图形?也许我可以得到一个plt.pause()从未显示过的“假”图形


谢谢

让我们看看
plt.pause()
是如何实现的:

def pause(interval):
    manager = _pylab_helpers.Gcf.get_active()
        if manager is not None:
            canvas = manager.canvas
            if canvas.figure.stale:
                canvas.draw_idle()
            show(block=False)
            canvas.start_event_loop(interval)
        else:
            time.sleep(interval)
因此,
plt.pause
的每次调用都会启动持续时间为
interval
秒的事件循环,并应用于所有图形。这是不受欢迎的行为。但是,可以使用以下方法分别对每个图形执行相同操作:


始终将完整的错误消息(从单词“Traceback”开始)作为文本(而不是屏幕截图)进行讨论(不是评论)。还有其他有用的信息。请不要使用
在行尾-Python不需要它,而且看起来很糟糕。据我所知,
show()
是作为一种简单的方法创建的,仅用于显示图像-即用于调试。对于更复杂的内容,可能需要直接使用
tkinter
并在其窗口中嵌入绘图。但这可能是更复杂的工作。这看起来很像matplotlib中的一个bug。您可以在问题跟踪器上打开一个问题。
import matplotlib.pyplot as plt
active_figures = {}

def handle_close(event):
    print('closed figure:', active_figures[event.canvas])
    event.canvas.stop_event_loop()

def create_figure(name):
    fig = plt.figure(name)
    active_figures[fig.canvas] = name
    fig.canvas.mpl_connect('close_event', handle_close)
    fig.show()  # it also uses block, it is False by default
    print(name, 'starts event loop')
    fig.canvas.start_event_loop(2)
    print(name, 'stops event loop')

for name in ['fig1', 'fig2', 'fig3']:
    create_figure(name)

print("\nmy figures:")
for n in active_figures:
    print('{} is opened: {}'.format(active_figures[n], plt.fignum_exists(active_figures[n])))
plt.show() #this keeps all the existing figures responsive to close