python - 不使用 `show()` 的 Matplotlib 事件处理

标签 python events matplotlib event-handling

我正在尝试使用 Matplotlib 作为模拟器项目的前端。模拟器应该接受用户的输入并相应地更新数字。实时更新 maptlotlib 中的数字效果很好,但除非调用 show() ,否则不会有事件回调。

from time import sleep

import matplotlib.pyplot as plt

plt.figure()

def onclick(event):
    print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(
    event.button, event.x, event.y, event.xdata, event.ydata)

plt.gcf().canvas.mpl_connect('button_press_event', onclick)

plt.plot([0,1,2],[5,10,15])

plt.show()

此代码按照 http://matplotlib.org/users/event_handling.html 工作并输出事件

不幸的是,我需要能够在更新之间进行处理,并且无法将控制权交给 show()。从阻塞 show() 更改为:

plt.show()

对于非阻塞 show(block=False) 不起作用:

plt.show(block=False)

#Running simulator, but not unable to receive events.
for i in xrange(10):
    print "Working %s" %i
    sleep(1)

我认为这与缺少进行事件处理的主循环有关。我没有找到有关如何手动执行此操作的信息。

最佳答案

根据您需要执行的工作,您可以使用 Matplotlib 添加动画,如下所示,这将定期重复调用函数:

import matplotlib.pyplot as plt
import matplotlib.animation as animation


def one_second(event):
    global count
    count += 1
    print "Working %s" % count

def onclick(event):
    print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(
    event.button, event.x, event.y, event.xdata, event.ydata)

count = 0
fig = plt.figure()
fig.canvas.mpl_connect('button_press_event', onclick)
plt.plot([0,1,2],[5,10,15])
ani = animation.FuncAnimation(fig, one_second, repeat=True, interval=1000)
plt.show()            

这将打印如下内容:

Working 1
Working 2
Working 3
Working 4
Working 5
Working 6
button=1, x=317, y=181, xdata=0.932120, ydata=8.018293
Working 7
button=1, x=388, y=233, xdata=1.213141, ydata=9.603659
button=1, x=273, y=285, xdata=0.757966, ydata=11.189024
Working 8
<小时/>

或者,您可以使用 plt.pause() 尝试以下方法:

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import time


def onclick(event):
    print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(
    event.button, event.x, event.y, event.xdata, event.ydata)

fig = plt.figure()
fig.canvas.mpl_connect('button_press_event', onclick)
plt.plot([0, 1, 2], [5, 10, 15])

plt.ion()
plt.show()
count = 0
next = 0

while plt.fignum_exists(fig.number):
    print "Working %s" % count

    while time.time() < next:
        plt.pause(.001) 

    next = time.time() + 1.0  
    count += 1

关于python - 不使用 `show()` 的 Matplotlib 事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35986724/

相关文章:

javascript - Paper.js 区分点击和拖动事件

jQuery - 当鼠标不在两个对象上时触发 'mouseleave' 事件

python - PyPDF 的 PdfFileReader() 读取文件有问题,文件不可调用

python - OpenCV:错误:(-215:断言失败)函数 'cv::equalizeHist' 中的 _src.type() == CV_8UC1

javascript - 如何在backbone.js事件委托(delegate)中使用 "hashchange"事件?

python - 箭袋图不会出现在所有子图上

python - 用 NaN 填充缺失的日期时间或抑制线图中的直线

python - 在 matplotlib 中为(艺术家)动画添加图例

python - 在 python 中声明文件夹路径的正确方法是什么?

python - 具有自定义层的 PyTorch 网络在 CPU 上运行良好,但在移动到 GPU 时会出现 cudaErrorIllegalAddress