2013-12-02 4 views
0

Я пытался получить некоторые 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):

from pylab import * 
from cmath import * 

debug = False 
pressed = False 
firstPt = None 
lastPt = None 
isum = 0 

def plotpt(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(event): 
    lastPt = event.xdata + 1j*event.ydata 
    firstPt = lastPt 
    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(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(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",firstPt,"to",lastPt,"along f(z) =",func,':' 
    print 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() 

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

plt.draw() 
show()#looks like nothing after this line runs. 
+0

Показать последнюю строку - в обоих этих примерах. – NoBugs

+0

Достаточно честный. Можете ли вы уменьшить это до минимального примера? – tacaswell

+0

также, что означает «частично работает»? – tacaswell

ответ

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)