May-16-2022, 07:48 PM
I managed to modify the code using you and menator01's help. I have 2 more questions. how I can destroy the initial canvas. currently, the new canvases stack on each other. I tried to use convas.destroy() and convase.delete() in the update(), but it raises errors.
And, Can I move the slider into the toplevel window and update the plot from there. I mean I keep only the button in main window.
here is the modified code:
And, Can I move the slider into the toplevel window and update the plot from there. I mean I keep only the button in main window.
here is the modified code:
import tkinter as tk import numpy as np from matplotlib.figure import Figure from matplotlib import cm from matplotlib.colors import ListedColormap from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk) class Data: def __init__(self): self.layer = tk.IntVar() class SampleApp(tk.Tk): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) container = tk.Frame(self) container.pack() self.data = Data() self.frames = {} for F in (page1,): frame = F(container, self.data) self.frames[F] = frame frame.pack() def show_frame(self, c): frame = self.frames[c] frame.tkraise() class page1(tk.Frame): def __init__(self, parent, data): super().__init__(parent) self.data = data frame1 = tk.Frame(self, width=200) frame1.pack() label1 = tk.Label(frame1, text="Layer number:") label1.grid(row=0, column=0, padx=10) self.h_slider1 = tk.Scale(frame1, from_=1, to=10, orient="horizontal", length=100, resolution=1, variable=self.data.layer) self.h_slider1.grid(row=0, column=1) self.button = tk.Button(frame1, text="plot", command=self.plot) self.button.grid(row=1, column=0, columnspan=2, pady=20) np.random.seed(2) self.num = list(np.random.randint(low=1, high=10, size=120)) self.button['command'] = self.open self.h_slider1['command'] = self.update def plot(self, var, window): nx = 3 ny = 4 num_reshaped = np.array(self.num).reshape(10, nx * ny) layer = num_reshaped[var - 1:var, :] layer = layer.reshape(nx, ny) x, y = np.mgrid[slice(0, nx + 1, 1), slice(0, ny + 1, 1)] self.figure = Figure(figsize=(4, 4)) ax = self.figure.add_subplot(111) col_type = cm.get_cmap('rainbow', 256) newcolors = col_type(np.linspace(0, 1, 1000)) white = np.array([1, 1, 1, 1]) newcolors[:1, :] = white newcmp = ListedColormap(newcolors) c = ax.pcolormesh(x, y, layer, cmap=newcmp, edgecolor='lightgrey', linewidth=0.003) ax.figure.colorbar(c) self.canvas = FigureCanvasTkAgg(self.figure, window) self.canvas.draw() self.canvas.get_tk_widget().pack() def open(self): self.toplevel = tk.Toplevel() self.toplevel.geometry('+500+100') self.plot(self.data.layer.get(), self.toplevel) def update(self, *args): self.plot(self.data.layer.get(), self.toplevel) app = SampleApp() app.mainloop()