如何在matplotlib中为pyplot.show()设置超时时间?

14

我正在使用Python的matplotlib绘制图形。

我想要绘制一张带有超时的图,例如3秒钟后窗口将关闭以继续执行代码。

我知道pyplot.show()会创建一个阻塞窗口且不限制超时时间;pyplot.show(block = False)pyplot.draw()会使窗口非阻塞。但是,我所需要的是让代码阻塞几秒钟。

我已经想到可以使用事件处理程序之类的东西,但仍然不太清楚如何解决这个问题。有没有简单而优雅的解决方案?

假设我的代码像以下这样:

Draw.py:

import matplotlib.pyplot as plt

#Draw something
plt.show() #Block or not?

sleep 不起作用? - Jorge Leitao
嗯,我不知道在哪里放置sleep...你的意思是我应该在show()之前还是之后放置sleep()? - Ting Yi Shih
抱歉前几分钟进行了多次修改...我还不熟悉StackOverflow的界面...现在我已经完成了我的修改。 - Ting Yi Shih
我现在明白你的问题了。我不知道。:/ - Jorge Leitao
2个回答

30

这是一个简单的例子,我创建了一个计时器来设置你的超时时间,并在回调函数中执行了窗口关闭 plot.close() 。在plot.show()之前启动计时器,在三秒后计时器调用close_event(),然后继续执行其余的代码。

import matplotlib.pyplot as plt

def close_event():
    plt.close() #timer calls this function after 3 seconds and closes the window 

fig = plt.figure()
timer = fig.canvas.new_timer(interval = 3000) #creating a timer object and setting an interval of 3000 milliseconds
timer.add_callback(close_event)

plt.plot([1,2,3,4])
plt.ylabel('some numbers')

timer.start()
plt.show()
print("I am doing something else")

希望这对你有所帮助。


3

Mac OSX 上,这对我没有起作用。

看起来有两个问题:

  1. 调用 plt.close() 不足以退出程序,可以使用 sys.exit()

  2. 预定的函数似乎在启动时被调用。这会导致显示时间为零。窗口会同时弹出和消失。在回调中使用状态来区别第一次调用可以解决此问题。具有特殊方法 __call__() 实例的类是处理这种有状态可调用对象的好方法。

这对我有所帮助:

from __future__ import print_function

import sys

import matplotlib.pyplot as plt


class CloseEvent(object):

    def __init__(self):
        self.first = True

    def __call__(self):
        if self.first:
            self.first = False
            return
        sys.exit(0)


fig = plt.figure()
timer = fig.canvas.new_timer(interval=3000)
timer.add_callback(CloseEvent())


plt.plot([1,2,3,4])
plt.ylabel('some numbers')

timer.start()
plt.show()
print("Am doing something else")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接