Если вы хотите щелкнуть мышью, вам нужно использовать "button_press_event"
вместо "key_press_event"
, который предназначен для клавиш клавиатуры.
self.canvas.mpl_connect("button_press_event", self.on_key_press)
Или вы можете использовать оба - и вы можете назначить разные методы
self.canvas.mpl_connect("key_press_event", self.on_key_press)
self.canvas.mpl_connect("button_press_event", self.on_button_press)
и
def on_button_press(self, event):
print('-----')
print('button:', event.button)
print('xdata, ydata:', event.xdata, event.ydata)
print('x, y:', event.x, event.y)
print('canvas:', event.canvas)
print('inaxes:', event.inaxes)
Дополнительные типы событий вы можете найти в matplotlib.pyplot.connect или Обработка событий
(но мне кажется, что для мыши DoubleClick
нет)
Если вы хотите отключить событие, вам нужно сохранить значение, возвращаемое mpl_connect
# connect
self.button_press_id = self.canvas.mpl_connect("button_press_event", self.on_button_press)
# disconnect
self.canvas.mpl_disconnect(self.button_press_id)
Таким образом, вы можете использовать различные функции для разных участков.
Минимальный рабочий код:
from tkinter import * # PEP8: `import *` is not preferred
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import (
FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figure
# (not so) random data
import random
random.seed(0) # will give the same values in every execution
Z_filt_1 = [random.randint(0, 100) for _ in range(10)]
Z_filt_2 = [random.randint(0, 100) for _ in range(10)]
class MatPlotLibSwitchGraphs:
def __init__(self, master):
self.master = master
self.frame = Frame(self.master)
self.frame.pack(expand=YES, fill=BOTH)
self.fig = Figure(figsize=(5, 4), dpi=100)
self.ax = self.fig.gca() #config_plot()
self.canvas = FigureCanvasTkAgg(self.fig, self.master)
self.config_window()
self.graphIndex = 0
self.draw_graph_one()
def config_window(self):
toolbar = NavigationToolbar2Tk(self.canvas, self.master)
toolbar.update()
self.canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)
print('connect')
self.canvas.mpl_connect("key_press_event", self.on_key_press)
self.canvas.mpl_connect("button_press_event", self.on_button_press)
self.button = Button(self.master, text="QUIT", command=self._quit)
self.button.pack(side=BOTTOM)
self.button_switch = Button(self.master, text="CHANGE PLOT", command=self.switch_graphs)
self.button_switch.pack(side=BOTTOM)
def draw_graph_one(self):
self.ax.clear()
self.ax.plot(Z_filt_1)
self.ax.set(title='First Plot')
self.canvas.draw()
def draw_graph_two(self):
self.ax.clear()
self.ax.plot(Z_filt_2)
self.ax.set(title='Second Plot')
self.canvas.draw()
def on_key_press(self, event):
print('key:', event.key)
def on_button_press(self, event):
print('-----')
print('button:', event.button)
print('xdata, ydata:', event.xdata, event.ydata)
print('x, y:', event.x, event.y)
print('canvas:', event.canvas)
print('inaxes:', event.inaxes)
def _quit(self):
#self.master.quit() # stops mainloop
self.master.destroy() # works better then `quit()` (at least on Linux)
def switch_graphs(self):
# Need to call the correct draw, whether we're on graph one or two
self.graphIndex = (self.graphIndex + 1 ) % 2
if self.graphIndex == 0:
self.draw_graph_one()
else:
self.draw_graph_two()
def main():
root = Tk()
MatPlotLibSwitchGraphs(root)
root.mainloop()
if __name__ == '__main__':
main()
BTW: PEP 8 - - Руководство по стилю для Python Код