与 Tkinter 一起使用时不会生成 mplcursors。我究竟做错了什么?
mplcursors not getting generated when used with Tkinter. What am I doing wrong?
使用 mplcursors,当 plot 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 的情况下添加和操作游标。
两个问题:
- 在 GUI 中嵌入 matplotlib 时不应使用 pyplot。参考embedding in tk example.
mplcursors
需要与数字 canvas 一起工作。所以它只能在 canvas 定义后使用。因此代码行需要在 之后 定义 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()
使用 mplcursors,当 plot 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 的情况下添加和操作游标。
两个问题:
- 在 GUI 中嵌入 matplotlib 时不应使用 pyplot。参考embedding in tk example.
mplcursors
需要与数字 canvas 一起工作。所以它只能在 canvas 定义后使用。因此代码行需要在 之后 定义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()