绑定事件以单击 tkinter 中的绘图 canvas

Bind event to click on plot in tkinter canvas

我可以像这样将点击事件绑定到绘图(即打印被点击的坐标):

from matplotlib.backend_bases import MouseButton
import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [2, 3, 1, 4]
fig, ax = plt.subplots()
ax.plot(x, y)

def plotClick(event):
   if event.button == MouseButton.LEFT:
      print('Clicked at x=%f, y=%f' %(event.xdata, event.ydata))

plt.connect('button_press_event', plotClick)

plt.show()

我想对包含在 tkinter window 中的 canvas 中的图做同样的事情,如下所示:

from matplotlib.backend_bases import MouseButton
import tkinter as tk
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

window = tk.Tk()
fig = Figure(figsize=(5, 3))
ax = fig.add_subplot(111)
x = [1, 2, 3, 4]
y = [2, 3, 1, 4]
line, = ax.plot(x, y)
canvas = FigureCanvasTkAgg(fig)
canvas.draw()
canvas.get_tk_widget().pack()

def plotClick(event):
   if event.button == MouseButton.LEFT:
      print('Clicked at x=%f, y=%f' %(event.xdata, event.ydata))

window.mainloop()

我需要做什么才能在此处完成相同的行为?

注意:我知道可以使用

将事件直接绑定到 canvas
canvas.get_tk_widget().bind('<Button-1>', plotClick)

def plotClick(event):
   print('Clicked at x=%f, y=%f' %(event.x, event.y))

然而,这使用 canvas 上的像素坐标而不是绘图中的坐标。

不使用plt.connect,而是使用

canvas.mpl_connect('button_press_event', plotClick)

使用它,您可以使用 event.xdataevent.ydata 访问绘图中的坐标,但您仍然可以使用 [=14] 访问 canvas 上的(像素)坐标=] 和 event.y.