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