Tkinter Frame Resize

He estado estancado durante unos días tratando de averiguar cómo puedo cambiar el tamaño del marco en TKInter dinámicamente usando este enfoque.

class SampleApp(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) # the container is where we'll stack a bunch of frames # on top of each other, then the one we want visible # will be raised above the others container = tk.Frame(self) container.pack(side="top", fill="both", expand=True) container.grid_rowconfigure(0, weight=1) container.grid_columnconfigure(0, weight=1) self.frames = {} for F in (StartPage, PageOne, PageTwo): page_name = F.__name__ frame = F(container, self) self.frames[page_name] = frame # put all of the pages in the same location; # the one on the top of the stacking order # will be the one that is visible. frame.grid(row=0, column=0, sticky="nsew") self.show_frame("StartPage") def show_frame(self, page_name): '''Show a frame for the given page name''' frame = self.frames[page_name] frame.tkraise() class StartPage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller label = tk.Label(self, text="This is the start page", font=TITLE_FONT) label.pack(side="top", fill="x", pady=10) button1 = tk.Button(self, text="Go to Page One", command=lambda: controller.show_frame("PageOne")) button2 = tk.Button(self, text="Go to Page Two", command=lambda: controller.show_frame("PageTwo")) button1.pack() button2.pack() class PageOne(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller label = tk.Label(self, text="This is page 1", font=TITLE_FONT) label.pack(side="top", fill="x", pady=10) button = tk.Button(self, text="Go to the start page", command=lambda: controller.show_frame("StartPage")) button.pack() class PageTwo(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller label = tk.Label(self, text="This is page 2", font=TITLE_FONT) label.pack(side="top", fill="x", pady=10) button = tk.Button(self, text="Go to the start page", command=lambda: controller.show_frame("StartPage")) button.pack() if __name__ == "__main__": app = SampleApp() app.mainloop() 

Copié este código de Switch entre dos marcos en tkinter , porque estoy siguiendo el mismo enfoque.

El problema al que me estoy enfrentando es que al usar este enfoque, todos los marcos se astackn en un contenedor y el tamaño de este contenedor es el tamaño de su marco más grande. Pasar de un cuadro a otro no cambia el tamaño de la ventana respectiva dinámicamente y genera un gran espacio libre en cuadros pequeños. Probé diferentes técnicas para hacer que todos los marcos en el contenedor se redimensionen dinámicamente pero sin mucho éxito. ¿Alguien puede sugerir lo que puedo hacer?

En lugar de astackr los marcos, asegúrese de que solo uno sea administrado por cuadrícula a la vez. Puede hacerlo llamando a grid_remove() del marco actual y luego a grid() en el nuevo marco. O, siendo perezoso, puedes llamar a grid_remove() en todo para que no tengas que recordar qué página es la actual.

 def show_frame(self, page_name): '''Show a frame for the given page name''' for frame in self.frames.values(): frame.grid_remove() frame = self.frames[page_name] frame.grid() 

Nota: el cambio de tamaño automático dejará de funcionar si le da a la ventana principal un tamaño fijo con el método de geometry en la ventana raíz, o si el usuario cambia el tamaño de la ventana manualmente. Esto se debe a que tkinter supone que si algo solicita explícitamente un tamaño de ventana, ese tamaño debe respetarse.

Si siempre desea que la ventana cambie de tamaño, debe restablecer la geometría a una cadena vacía. Puede agregar esto como la última statement en el método show_frame :

 frame.winfo_toplevel().geometry("")