Tkinter 和 matplotlib:绑定到FigureCanvasTkAgg 以提取图中的光标位置?

问题描述 投票:0回答:2

我想使用 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 matplotlib tkinter
2个回答

0
投票

我的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()
© www.soinside.com 2019 - 2024. All rights reserved.