簡體   English   中英

如何等待用戶單擊 IPython Notebook 中圖形中的一個點?

[英]How to wait for the user to click a point in a figure in IPython notebook?

我采取了以下步驟在 Google Colab notebook 中設置 IPython 后端:

!pip install ipympl
from google.colab import output
output.enable_custom_widget_manager()  

然后我記錄用戶點擊圖形的 (x,y) 位置:

%matplotlib ipympl
import matplotlib
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

def onclick(event):
    ix, iy = event.xdata, event.ydata
    print(ix, iy)

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

我需要代碼在這里等待,直到用戶選擇至少一個數據點。 但是,如果我在同一個筆記本中有另一個命令,代碼將運行,例如:

print ('done!')

將在不等待用戶選擇數據點的情況下運行。 我之前嘗試過使用它:

plt.waitforbuttonpress()
print('done!')

但是,編譯器會卡在 plt.waitforbuttonpress() 處,並且不允許用戶單擊圖形。 謝謝你的幫助

您可以不將要運行的代碼放在button_press_event之后,而是放在事件偵聽器之后,而是將其放在onclick函數中。 像這樣:

%matplotlib ipympl
import matplotlib
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

def onclick(event):
    ix, iy = event.xdata, event.ydata
    print(ix, iy)
    print('done!')

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

要么:

%matplotlib ipympl
import matplotlib
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

def after_onclick():
    print('done!')
def onclick(event):
    ix, iy = event.xdata, event.ydata
    print(ix, iy)
    after_onclick()

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

這樣做的原因是因為mpl_connect工作起來很奇怪(見這個問題)。 它不會等待事件被注冊並暫停代碼執行,而是運行整個文件但保持事件偵聽器打開。

這種方式的問題是每次注冊事件時都會運行代碼。

如果那不是您想要的,並且您只希望它運行一次,請嘗試以下操作:

%matplotlib ipympl
import matplotlib
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

def after_onclick():
    print('done')
    fig.canvas.mpl_disconnect(cid)
def onclick(event):
    ix, iy = event.xdata, event.ydata
    print(ix, iy)
    after_onclick()

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

該版本添加了fig.canvas.mpl_disconnect(cid)以便代碼只運行一次。

如果您在本地運行普通筆記本而不是 Colab,例如在 VSCode 中,您還可以使用figure.ginput(n=1)以阻塞方式等待用戶點擊。

fig, ax = plt.subplots()

clicks = fig.ginput(n=1)
print('Done:', clicks)

輸出:

Done: [(9.070766129032256, 0.17960461218983856)]

在 Jupyter + VSCode 上對此進行了測試並且它有效,創建了一個供您單擊的窗口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM