У меня есть график на FigureCanvasTkAgg, и я хочу использовать кнопку с именем «Retracement» для создания нескольких линий. Как связать несколько строк как один объект, чтобы при нажатии кнопки «Ластик» и выборе одной строки с помощью «событий выбора» все строки выбирались и удалялись вместе?
До сих пор, когда я использую кнопку «Ластик», я могу выбрать отдельные строки для удаления, но это не соответствует моей цели
![Deleting only one line after using 'Eraser'](https://i.stack.imgur.com/cWc8v.png)
'' '
import tkinter as tk
from tkinter import ttk
import matplotlib
import numpy as np
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.backend_bases import MouseEvent
from matplotlib.figure import Figure
from matplotlib import style
from matplotlib import pyplot as plt
class XYZapp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs) # initialising tkinter within the class
frame = ttk.LabelFrame(self)
frame.pack(side=tk.TOP,fill=tk.BOTH, expand=True)
f = Figure(figsize=(5,5), dpi=100)
ax = f.add_subplot(111)
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # assume this is change in time which is constant
y = [10, 14, 13, 12, 15, 18, 16, 20, 24, 21] # assume this is price
self.canvas = FigureCanvasTkAgg(f, self)
self.canvas.draw()
self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)
ax.plot(x,y,color = 'r')
self.canvas.draw()
ly = []
lx = []
def callback_fr(event):
if len(ly) < 2:
ly.append(event.ydata)
lx.append(event.xdata)
print(ly)
else :
self.canvas.mpl_disconnect(cid)
print('mpl disconnected')
y1 = ly[0]
y2 = ly[1]
x_min = lx[0]
x_max = lx[1]
diff = y2-y1
fib_r = {0:'r', 0.238:'g', 0.382:'b', 0.5:'y', 0.618:'k', 1:'c'}
for k, v in fib_r.items():
fib = y2 - k*diff
ax.hlines(fib,x_min,x_max,linestyle = 'dashed', lw = 1, label='1',picker = True )
ax.annotate(str(k),xy=(x_max,fib))
self.canvas.draw()
def onclick_fr():
ly.clear()
lx.clear()
global cid
cid = self.canvas.mpl_connect('button_press_event',callback_fr)
def eraser2(event):
thisline = event.artist
thisline.remove()
self.canvas.draw()
def eraser():
global cid4
cid4 = self.canvas.mpl_connect('pick_event',eraser2)
button1 = ttk.Button(frame, text = 'Retracement', command=onclick_fr)
button1.grid(row=0, column=0)
button2 = ttk.Button(frame, text='eraser', command=eraser)
button2.grid(row=1, column=0)
# Navigation toolbar
self.toolbar = NavigationToolbar2Tk(self.canvas, self)
self.toolbar.update()
self.canvas._tkcanvas.pack(side=tk.TOP,fill=tk.BOTH, expand=True)
app = XYZapp()
app.geometry('1280x720')
app.mainloop()
' ''