Python 为什么不';我的matplotlib事件在课堂上使用时是否会触发?

Python 为什么不';我的matplotlib事件在课堂上使用时是否会触发?,python,matplotlib,complex-numbers,Python,Matplotlib,Complex Numbers,我试图让一些eventlisteners工作,但在课堂上它似乎没有任何作用-甚至没有打印出信息: from pylab import * from cmath import * class integrator: def __init__(self, func, fig): self.debug = False self.pressed = False self.firstPt = None self.lastPt =

我试图让一些eventlisteners工作,但在课堂上它似乎没有任何作用-甚至没有打印出信息:

from pylab import *
from cmath import *

class integrator:

    def __init__(self, func, fig):
        self.debug = False
        self.pressed = False
        self.firstPt = None
        self.lastPt = None
        self.isum = 0
        cid = fig.canvas.mpl_connect('button_press_event', self.onclick)
        fig.canvas.mpl_connect('motion_notify_event', self.onmove)
        fig.canvas.mpl_connect('button_release_event', self.onUp)

    #def plotpt(self, z, mark=','):
        #ax.plot(z.real, z.imag, 'k'+mark)#black point.
        #try:
            #result = eval(func)
            #if debug:
                #print 'result',result
            #ax.plot(result.real, result.imag, 'r'+mark)#red result point.
        #except ZeroDivisionError:
            #print "Undefined/infinite (/0) at", z

    def onclick(self, event):
        self.lastPt = event.xdata + 1j*event.ydata
        self.firstPt = self.lastPt
        self.isum = 0
        print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(
            event.button, event.x, event.y, event.xdata, event.ydata)

    def onmove(self, event):
        if event.xdata is not None and event.ydata is not None and lastPt is not None :
            print event.xdata, event.ydata
            pt = event.xdata + 1j*event.ydata
            diff = abs(pt - lastPt)
            z = lastPt
            nth = eval(func)
            z = pt
            nxt = eval(func)
            part = (nth+nxt)/2 * diff
            print nth,nxt,diff
            isum += part


    def onUp(self, event):
        print 'UP button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(
            event.button, event.x, event.y, event.xdata, event.ydata)
        print "From",self.firstPt,"to",self.lastPt,"along f(z) =",func,':'
        print self.isum


print "Note: phase(z) is argument, z.conjugate() is conj, z.real, z.imag are re/im parts."
func = raw_input('f(z)=')
fig = plt.figure("Complex function f(z)="+func)
ax = fig.add_subplot(1,1,1)
ax.set_xbound(-3,3)
ax.set_ybound(-3,3)
#ax.plot(np.random.rand(10))
fig.set_label('F(z)='+func)

plt.draw()

integrator(func, fig)

plt.draw()
show()#looks like nothing after this line runs.
在我把它变成一个类之前,它至少部分工作了:在这里,它至少会打印出一些东西,但找不到你在屏幕上点击并拖动的任何曲线的复杂曲线积分(总是说它是0):


这段代码有很多问题,但关于为什么在显示绘图窗口后什么都没有发生的问题,答案相当简单:

您需要保留对所使用对象的引用。

这意味着您需要将类实例存储在变量中

integ = integrator(func, fig)
您还需要将事件处理程序存储在类变量中

self.cid = fig.canvas.mpl_connect('button_press_event', self.onclick)
self.cid2 = fig.canvas.mpl_connect('motion_notify_event', self.onmove)
self.cid3 = fig.canvas.mpl_connect('button_release_event', self.onUp)

在这两个例子中,Show是最后一行,这很公平。你能把它简化成一个最小的例子吗?还有,“部分工作”是什么意思?你能把例子简化一点吗?仍然有很多我怀疑是不相关的代码。
self.cid = fig.canvas.mpl_connect('button_press_event', self.onclick)
self.cid2 = fig.canvas.mpl_connect('motion_notify_event', self.onmove)
self.cid3 = fig.canvas.mpl_connect('button_release_event', self.onUp)