我做了一个最小的工作示例,说明了如何做到这一点。
它需要对您的代码进行更改,但我不知道您在代码中所拥有的内容,并且您也没有创建最少的工作示例。
它使用(without
)在
generate_all_figures(在您的代码中将
plot_sheets使用
s)中创建三个数字,并保持在列表中。
plot_sheet``s
window显示此列表中的第一个图形。
Buttons删除带有图形的画布,并从列表中使用下一个/上一个图形创建新的画布。
我使用
grid()而不是
pack()因为这样可以轻松地将新画布放在同一位置。
import tkinter as tkimport matplotlib.pyplot as pltfrom matplotlib.backends.backend_tkagg import FigureCanvasTkAggclass MyClass(): def __init__(self): self.sheets = [[1,2,3], [3,1,2], [1,5,1]] self.W = 2 self.L = 5 self.all_figures = [] def plot_sheet(self, data): """plot single figure""" fig, ax = plt.subplots(1) ax.set_xlim([0, self.W]) ax.set_ylim([0, self.L]) ax.plot(data) return fig def generate_all_figures(self): """create all figures and keep them on list""" for data in self.sheets: fig = self.plot_sheet(data) self.all_figures.append(fig)def show_figure(number): global dataPlot # remove old canvas if dataPlot is not None: # at start there is no canvas to destroy dataPlot.get_tk_widget().destroy() # get figure from list one_figure = my_class.all_figures[number] # display canvas with figuere dataPlot = FigureCanvasTkAgg(one_figure, master=window) dataPlot.draw() dataPlot.get_tk_widget().grid(row=0, column=0)def on_prev(): global selected_figure # get number of previous figure selected_figure -= 1 if selected_figure < 0: selected_figure = len(my_class.all_figures)-1 show_figure(selected_figure)def on_next(): global selected_figure # get number of next figure selected_figure += 1 if selected_figure > len(my_class.all_figures)-1: selected_figure = 0 show_figure(selected_figure)# --- main ---my_class = MyClass()my_class.generate_all_figures()window = tk.Tk()window.rowconfigure(0, minsize=500) # minimal heightwindow.columnconfigure(0, minsize=700) # minimal width# display first figure selected_figure = 0dataPlot = None # default value for `show_figure`show_figure(selected_figure)# add buttons to change figuresframe = tk.frame(window)frame.grid(row=1, column=0)b1 = tk.Button(frame, text="<<", command=on_prev)b1.grid(row=0, column=0)b2 = tk.Button(frame, text=">>", command=on_next)b2.grid(row=0, column=1)window.mainloop()
可能无需替换画布即可完成,但可以替换剧情中的数据(
fig.data???,
ax.data???我不记得了)



