Python 如何在tkinter中清除FigureCastKagg画布

Python 如何在tkinter中清除FigureCastKagg画布,python,tkinter,tkinter-canvas,Python,Tkinter,Tkinter Canvas,我试图删除框架中画布上的图形,并将图形保留在图形框架中。我已经读到canvas.delete('all')方法应该可以工作,但当我使用它时,它什么也不做,请有人指出我在这段代码中犯了什么错误,或者用一种更好的方法来做。我使用了graph_frame.destroy(),但它去掉了框架和图形。我的代码在下面,谢谢你的帮助 ## code below import tkinter from tkinter import * import numpy as np # Implement the de

我试图删除框架中画布上的图形,并将图形保留在图形框架中。我已经读到canvas.delete('all')方法应该可以工作,但当我使用它时,它什么也不做,请有人指出我在这段代码中犯了什么错误,或者用一种更好的方法来做。我使用了graph_frame.destroy(),但它去掉了框架和图形。我的代码在下面,谢谢你的帮助

## code below
import tkinter
from tkinter import *

import numpy as np
# Implement the default Matplotlib key bindings.
from matplotlib.backend_bases import key_press_handler
from matplotlib.backends.backend_tkagg import (
    FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figure
import matplotlib.pyplot as plt

my_window = tkinter.Tk()
my_window.geometry('1000x1000')
my_window.resizable(height=False, width=False)
current_list = ['Blue', 'Green', 'Yellow']

window_frame = tkinter.LabelFrame(my_window, height=800, width=600, text='window_frame', labelanchor='n', bd='4')
window_frame.grid(row=0, column=0, padx='10', pady='10')

graph_frame = tkinter.LabelFrame(window_frame, height=600, width=600, text='graph_frame', labelanchor='n', bd='4')
graph_frame.grid(row=0, column=0, padx='10', pady='10')

fig = Figure(figsize=(5, 5), dpi=100)
ax = fig.add_subplot(111)

for item in current_list:
    x, y = np.loadtxt(item + '_' + 'Test.csv', skiprows=1, usecols=[2, 3],
                      unpack=True, delimiter=',')
    ax.plot(x, y)

canvas = FigureCanvasTkAgg(fig, master=graph_frame)  # A tk.DrawingArea
canvas.draw()
canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)
toolbar = NavigationToolbar2Tk(canvas, graph_frame)
toolbar.update()


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():
    my_window.quit()  # stops mainloop
    my_window.destroy()  # this is necessary on Windows to prevent
    # Fatal Python Error: PyEval_RestoreThread: NULL tstate


button = tkinter.Button(master=my_window, text="Quit", command=_quit)
button.grid(row=2, column=1)

def _clear():
    canvas.delete('all')

    # Fatal Python Error: PyEval_RestoreThread: NULL tstate


button = tkinter.Button(master=window_frame, text="Clear", command=_clear)
button.grid(row=2, column=2)

my_window.mainloop()
Blue_Test.csv
Name1,Name2,Name3,Name4,Name5
1,10,19,1000,Blue
2,20,20,1001,Blue
3,30,21,1002,Blue
4,40,24,1005,Blue
5,60,25,1006,Blue
Green_Test.csv
Name1,Name2,Name3,Name4,Name5
1,10,19,1000,Green
2,40,24,1005,Green
3,60,25,1006,Green
4,20,20,1001,Green
5,30,21,1002,Green
Yellow_Test.csv
Name1,Name2,Name3,Name4,Name5
1,10,19,1000,Yellow
2,20,20,1001,Yellow
3,30,21,1002,Yellow
4,40,24,1005,Yellow
5,60,25,1006,Yellow
您可以尝试:

def _clear():
    for item in canvas.get_tk_widget().find_all():
       canvas.get_tk_widget().delete(item)
有关更多详细信息,请参见此处:

谢谢-我收到msg-类“FigureCastKagg”的未解析属性引用“delete”,然后要求我添加method.delete到FigureCastKagg-是否有我没有导入的东西?Duesnt似乎无法识别delete我没有注意到您的画布不是
tk.canvas
,而是在
FigureCastKagg
上。我相应地更新了我的答案,但不确定它是否有效。谢谢Jean-Marc,它起作用了-在find_all之前只需要canvas.get_tk_小部件。tk.Canvas和FigureCanvasTkAgg有什么区别?据我所知,
figureCastKagg
是一个包装器,可以让Matplotlib绘制到
tk.canvas
中。它不直接从
tk.Canvas
类继承,因此不能直接调用
delete
find\u all
。最好编辑您问题的标题,以便与清除
图castkagg