2015-04-04 101 views
0

我正在研究一個程序,該程序應該在兩點之間進行迭代,以便在給定特定容差的情況下查找函數的根。我的計劃是繪製函數,然後讓用戶通過單擊圖來指定兩個點。我的問題是,我沒有找到任何方法來「pa」程序,直到指定了兩點,它才繼續。例如,下面的代碼給IndexError:列表索引超出範圍要打印COORDS [0] [0]如何讓程序在繼續之前等待鼠標點擊

from matplotlib import pyplot as plt  

def on_press(event): 
    print('you pressed', event.button, event.xdata, event.ydata) 

    global ix, iy 
    ix, iy = event.xdata, event.ydata 

    coords = coords.append([ix, iy]) 

    if len(coords) >1: 
     fig.canvas.mpl_disconnect(cid) 

def get_clicks(fig): 
    cid = fig.canvas.mpl_connect('button_press_event', on_press) 

fig = plt.figure() 
ax = fig.add_subplot(111) 
plt.show() 

coords = [] 

get_clicks(fig) 

print(coords[0]) 

我想要做的,是必須在代碼等待時「get_clicks(圖)」直到獲得兩次點擊,然後繼續執行其餘的代碼。

更新。

現在,該代碼如下所示:

def bisec(a,b,tol): 

    print("Hi there!") 
    return a,b,mid 

def on_press(event): 
    print('you pressed', event.button, event.xdata, event.ydata) 

    global ix, iy 
    ix, iy = event.xdata, event.ydata 

    if len(coords)<=1: 
     global coords 
     coords.append([ix, iy]) 

    if len(coords) >1: 
     #fig.canvas.mpl_disconnect(cid) 
     print(coords) 
     bisec(coords[0][0], coords[1][0], 10) 

def get_clicks(fig): 
    global cid  
    cid = fig.canvas.mpl_connect('button_press_event', on_press) 

fig = plt.figure() 
ax = fig.add_subplot(111) 

coords = [] 

get_clicks(fig) 

plt.show() 

所有這一切的目的,我打電話給bisec時已經提供了2個座標,這似乎是目前的結果,精彩!

回答

1

plt.show 應該在最後一行之前。

座標應宣佈爲全球。 而 COORDS = coords.append([IX,IY]) 應該由 coords.append更換([IX,IY])

關於你的最後一個問題,是有可能。 的總體思路是把代碼 「內部」:

if len(coords) >1: 

例如:

if len(coords) >1: 
    do_what_I_mean(coords) 

如果你真的想這樣寫: fig.canvas.mpl_disconnect(CID) 你應該要小心,以確保:

1)CID是一個全局變量 (最簡單的方法:不作功能獲得點擊,只寫它的腳本內容)

2)並在on_press函數中聲明爲

+0

謝謝!現在座標存儲座標正確,但是,我仍然需要代碼等待2次鼠標點擊。我知道這在Java中是可能的,例如,python中是否存在類似的可能性? – user3105546 2015-04-04 16:53:51

+0

你見過我的編輯嗎? – 2015-04-07 07:58:19

+0

剛纔看到了,謝謝!取得一些進展,我會將原來的問題更新爲當前的代碼。 – user3105546 2015-04-08 09:03:29

相關問題