2017-10-06 87 views
1

我試圖編寫一個腳本,保存劇情(通過matplotlib生成)的前兩個鼠標點擊的座標,暫停腳本,直到發生這些點擊。我試圖通過一個while循環實現「暫停」,一旦回調函數檢測到鼠標點擊了兩次,該循環應該結束。但是,一旦while循環開始運行,單擊繪圖區域似乎不起作用。任何幫助將非常感激。暫停Python腳本,直到用戶雙擊劇情兩次

coords = [] 
pause = True 

fig, ax = plt.subplots() 
plt.pcolormesh(x_grid, y_grid, arr) 
plt.show() 

def onclick(event): 
    global coords 
    coords.append((event.xdata, event.ydata)) 
    if (len(coords)==2): 
     pause = False 
     fig.canvas.mpl_disconnect(cid) 

cid = fig.canvas.mpl_connect('button_press_event', onclick) 

while pause: 
    pass 

# ...More code to follow, after the while loop finishes 

回答

1

編輯答案: 我會去了解一下這樣的事情,他們有一個演示應用程序,但是這似乎正是你想要的功能。

https://matplotlib.org/devdocs/api/_as_gen/matplotlib.pyplot.ginput.html

這會變成你的代碼:

plt.pcolormesh(x_grid, y_grid, arr) 
coords = plt.ginput(2, show_clicks=False) 
plot.show(block=False) 

這將返回前兩個點擊COORDS窗口和離開情節開放。

- 原創回答

您是否在意點擊後打開的情節?如果沒有,那麼你可以刪除while循環,因爲plt.show()函數本質上是阻塞的。新的代碼版本則是:

coords = [] 
fig, ax = plt.subplots() 
plt.pcolormesh(x_grid, y_grid,arr) 

def onclick(event): 
    global coords 
    coords.append((event.xdata, event.ydata)) 
    if (len(coords)==2): 
     fig.canvas.mpl_disconnect(cid) 
     plt.close() 

cid = fig.canvas.mpl_connect('button_press_event', onclick) 
plt.show() 
print('Finished') 

你總是可以(假設不積超長渲染),只需一個電話之後,如:

plt.pcolormesh(x_grid, y_grid, arr) 
plt.show(block=False) 

要生成一個非阻塞版本點擊過程完成後,您的情節的圖。 (這似乎愚蠢,但我似乎無法找到一種快速的方法來將阻塞數字轉換爲非阻塞數字)

+0

Andrew,感謝您的建議。不幸的是,這並不奏效,因爲這個塊下面的代碼(在上面用我的評論「#... ...更多代碼遵循,在while循環結束後顯示」)繼續運行,打開窗口。我需要程序暫停以獲得鼠標座標,因爲這些座標在後面的代碼中是需要的。我也可能誤解你的建議,因爲我不清楚plt.show()中的「阻塞」是什麼意思。再次感謝你的幫助。 – Scott

+0

阻塞意味着一旦你調用'plt.show',它就不會執行其他任何事情,它會凍結(或阻塞)執行,直到你把圖表放下。如果你在while循環中添加一個print語句,它不應該打印任何東西,因爲它不會像當前代碼那樣真正進入while循環。 –

+0

謝謝你的解釋。在這種情況下,我懷疑plt.show()沒有被正確阻塞,因爲我的程序執行了plt.show()後面的代碼。 – Scott