2015-10-27 138 views
1

我想用鼠標繪製圖像上的點。 問題:出現圖像,但是當我點擊鼠標時,沒有任何繪圖(即使點擊幾次)。使用鼠標繪製Python中圖像上的點,用Matplotlib

我的Python版本是Python 2.7,帶有Anaconda和IPython控制檯。 在運行腳本之前,在Ipython控制檯中鍵入%pylab。

這裏是我的代碼:

import numpy as np 
from matplotlib import pyplot as plt 
#Some code here [. . .] 

fig, ax = plt.subplots(1) 
ax.imshow(img, interpolation = 'bicubic') 
'''preventing plot from rescaling image:''' 
ax.set_xlim([0.0, img.shape[1]]) 
ax.set_ylim([img.shape[0], 0.0]) 
ax.hold(True) 
ax.autoscale = False 
#ax.plot(100,100, 'ro') # This works 

class MouseMonitor: 
    flag = True 
    x = 0. 
    y = 0. 
    fig = None 
    axes = None 

    def __init__(self, fig, ax): 
     self.axes = ax 
     self.fig = fig 
    def __call__(self, event): 
     if self.flag: 
      print('({}, {})'.format(event.xdata, event.ydata)) 
      self.flag = False 
     else: 
      d = np.linalg.norm([event.xdata - self.x, event.ydata - self.y]) 
      print('({}, {})\n\n distance between points: {} m\n\n-------------------\n'.format(event.xdata, event.ydata, d)) 
      self.flag = True      
     self.x = event.xdata 
     self.y = event.ydata 
     self.axes.plot(self.y, self.x, 'ro', linewidth = 5) #This don't work 

mouse = MouseMonitor(fig, ax) 

cid = fig.canvas.mpl_connect('button_press_event', mouse) 
+1

您需要在回調中添加一個'self.axes.figure.canvas.draw_idle()'調用,直到畫布重繪爲止。 OO方法很懶,以避免不必要的重繪。 – tacaswell

+0

'self.fig.canvas.draw_idle()'也會工作,沒有看到你被捕獲了。 – tacaswell

+0

謝謝你這麼多tcaswell。它工作正常。 – MikeTeX

回答

1

從tcaswell評論答案:

添加self.axes.figure.canvas.draw_idle()調用步入回調。