在matplotlib中的button_press_event期间暂停执行

时间:2011-12-28 23:59:31

标签: python matplotlib

我正在尝试绘制用户点击的多边形并将其渲染到matplotlib画布上:

def helperClick(self, clickEvent):
        self.lastXClick = clickEvent.x 
        self.lastYClick = clickEvent.y
        self.lastButtonClick = clickEvent.button

def measurePoly(self):

    self.lastButtonClick = None
    cid = self.ui.canvas2.mpl_connect('button_press_event', self.helperClick)

    #Exit render loop on right click
    while self.lastButtonClick != 3:
       print('waiting')
       if self.lastButtonClick == 1:
           #Eventually render polygon on click of 1
           print('clicked')

    self.ui.canvas2.mpl_disconnect(cid)

    #do more stuff with polygon data

我只是想"等待"对于用户点击,在用户点击时执行某些操作,然后通过左键单击继续执行该功能。然而,我的无限循环冻结了python和崩溃。我知道这是一个不好的方法(显然它不起作用:P)但我不确定如何正确地做到这一点。

谢谢,

tylerthemiler

1 个答案:

答案 0 :(得分:2)

听起来你正试图在自己的代码中手动运行“mainloop”?

使用回调函数的关键在于你让gui工具包运行自己的mainloop(在这种情况下,当你调用show时输入它。)

这是一个非常简单的例子,说明了你要做的事情。

在左键单击(最初为空白)绘图时添加顶点,然后在右键单击时绘制相应的多边形。在右键单击之前不会绘制任何内容(在通过左键单击添加点时绘制多边形并不太难,但在matplotlib中有效地执行它有点冗长)。

import matplotlib.pyplot as plt

class Plot(object):
    def __init__(self):
        self.poly = []
        self.fig, self.ax = plt.subplots()
        self.ax.axis([0, 10, 0, 10])
        self.fig.canvas.mpl_connect('button_press_event', self.on_click)

        plt.show()

    def on_click(self, event):
        if event.button == 1:
            self.poly.append((event.xdata, event.ydata))
        elif event.button == 3:
            self.draw_poly()

    def draw_poly(self):
        self.ax.fill(*zip(*self.poly))
        self.poly = []
        self.fig.canvas.draw()

Plot()