Python 为什么不';我的matplotlib事件在课堂上使用时是否会触发?
我试图让一些eventlisteners工作,但在课堂上它似乎没有任何作用-甚至没有打印出信息: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 =
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)