我想使用 matplotlib 绘制二维数组,然后在单击绘制的图像时提取光标位置。这是我如何编写它的一个最小的工作示例:
from tkinter import *
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib import pyplot as plt
def callback(event):
print ("clicked at", event.x, event.y)
root = Tk()
mf = Frame()
figure = plt.Figure()
axes = figure.add_subplot(111)
canvas_wid = FigureCanvasTkAgg(figure, master=mf)
canvas_wid.get_tk_widget().pack()
root.bind("<Button-1>", callback)
mf.pack()
root.mainloop()
但是,我不想获得有关根的坐标,而是在图中。当我将单击绑定到 mf 时,程序会运行,但单击不会触发任何响应。当我将它绑定到 Canvas 小部件时 - 据我了解,这正是我想要的,我收到以下错误消息:
AttributeError: 'FigureCanvasTkAgg' object has no attribute 'bind'
显然,当我使用FigureCanvasTKagg定义Canvas时,它不是一个小部件?需要什么结构来提取图形中的光标位置?
我对 python 中的 GUI 编程相当陌生,我认为我错过了一个非常基本的点。我检查了 tkinter 和 matpotlib 的参考手册,阅读了很多其他问题,但无法找到我的谬误。
我的Python版本:3.9
matplotlib 版本:3.8.3
以下代码有效:
import tkinter as tk
import ttkbootstrap as ttk
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
print(matplotlib.__version__)
def callback(event):
print('the position',event.x,event.y)
root = tk.Tk()
frame = tk.Frame(root, width=200, height=200)
frame.pack()
fig = plt.figure(figsize=(10, 10), dpi=70)
plt.plot([1,2,3], [1,2,3])
canvas = FigureCanvasTkAgg(fig, master=frame)
canvas.draw()
canvas.get_tk_widget().pack(anchor="nw")
canvas.get_tk_widget().bind('<Button-1>',callback)
root.mainloop()