与Tkinter一起使用时不会生成mplcursors。我究竟做错了什么?

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

使用mplcursors,当绘制matplotlib嵌入tkinter gui时,我无法在绘图中添加游标。似乎鼠标点击没有注册。但是缩放,平移功能可以正常工作。我错过了什么?

我使用Anaconda Python 3.7.3,matplotlib 3.0.3和mplcursors库。 https://mplcursors.readthedocs.io/en/stable/#

我可以复制没有tkinter的简单示例,并根据需要添加交互式游标。我也可以在tkinter应用程序中嵌入matplotlib图。但是当两者结合在一起时 - 即使绘图没有错误,交互式游标也不起作用。

import tkinter

from matplotlib.backends.backend_tkagg import (
    FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.backend_bases import key_press_handler
import matplotlib.pyplot as plt

import numpy as np
import mplcursors


root = tkinter.Tk()
root.wm_title("Embedding in Tk")


t = np.arange(0, 3, .01)

fig, ax = plt.subplots(1, 1)
line = ax.plot(t, 2 * np.sin(2 * np.pi * t))

mplcursors.cursor(line)

canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)

toolbar = NavigationToolbar2Tk(canvas, root)
toolbar.update()
canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)


def on_key_press(event):
    print("you pressed {}".format(event.key))
    key_press_handler(event, canvas, toolbar)


canvas.mpl_connect("key_press_event", on_key_press)


def _quit():
    root.quit()
    root.destroy()  

button = tkinter.Button(master=root, text="Quit", command=_quit)
button.pack(side=tkinter.BOTTOM)

tkinter.mainloop()

我应该可以像没有tkinter的示例一样添加和操作游标。

python matplotlib tkinter interactive
1个回答
1
投票

两个问题:

  1. 在GUI中嵌入matplotlib时不应使用pyplot。请参阅embedding in tk example
  2. mplcursors需要使用图形画布。所以它只能在定义画布后使用。所以代码行需要在定义FigureCanvasTkAgg之后。

完整代码:

import tkinter

from matplotlib.backends.backend_tkagg import (
    FigureCanvasTkAgg, NavigationToolbar2Tk)
# Implement the default Matplotlib key bindings.
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure

import numpy as np
import mplcursors


root = tkinter.Tk()
root.wm_title("Embedding in Tk")


t = np.arange(0, 3, .01)

fig = Figure()
ax = fig.add_subplot(111)
line = ax.plot(t, 2 * np.sin(2 * np.pi * t))

canvas = FigureCanvasTkAgg(fig, master=root)

mplcursors.cursor(line)

canvas.draw()
canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)

toolbar = NavigationToolbar2Tk(canvas, root)
toolbar.update()
canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)


def on_key_press(event):
    print("you pressed {}".format(event.key))
    key_press_handler(event, canvas, toolbar)


canvas.mpl_connect("key_press_event", on_key_press)


def _quit():
    root.quit()
    root.destroy()  

button = tkinter.Button(master=root, text="Quit", command=_quit)
button.pack(side=tkinter.BOTTOM)

tkinter.mainloop()
© www.soinside.com 2019 - 2024. All rights reserved.