mplcursors не генерируется при использовании с Tkinter. Что я делаю неправильно? - PullRequest
0 голосов
/ 16 апреля 2019

Используя mplcursors, я не могу добавить курсоры на график, когда график matplotlib встроен в графический интерфейс tkinter. Похоже, что щелчки мыши не регистрируются. Однако функции масштабирования и панорамирования работают нормально. Чего мне не хватает?

Я использую Anaconda Python 3.7.3, matplotlib 3.0.3 и библиотеку mplcursors. https://mplcursors.readthedocs.io/en/stable/#

Я могу скопировать простой пример без tkinter и добавлять интерактивные курсоры по мере необходимости. Я также могу встраивать сюжет matplotlib в приложение tkinter. Однако, когда они объединены - хотя график отображается без ошибок, интерактивные курсоры не работают.

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.

1 Ответ

1 голос
/ 16 апреля 2019

Две проблемы:

  1. Вы не должны использовать pyplot при внедрении matplotlib в GUI.Обратитесь к примеру встраивание в 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()
...