为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

阿晨1998 2022-01-11 17:57:10
使用 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 tkinterfrom matplotlib.backends.backend_tkagg import (    FigureCanvasTkAgg, NavigationToolbar2Tk)from matplotlib.backend_bases import key_press_handlerimport matplotlib.pyplot as pltimport numpy as npimport mplcursorsroot = 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 的情况下,我应该能够像示例中那样添加和操作光标。
查看完整描述

1 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

两个问题:

  1. 在 GUI 中嵌入 matplotlib 时不应使用 pyplot。请参阅tk 示例中嵌入

  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()


查看完整回答
反对 回复 2022-01-11
  • 1 回答
  • 0 关注
  • 390 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号