Tkinter Frame Redimensionner

j'ai été bloqué pendant quelques jours essayant de comprendre comment je peux redimensionner le cadre dans TKInter dynamiquement en utilisant cette approche.

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()

j'ai copié ce code de passer entre deux cadres dans tkinter , parce que je suis la même approche.

le problème auquel je fais face est qu'en utilisant cette approche tous les cadres sont empilés dans un conteneur et la taille de ce conteneur est la taille de son plus grand cadre. Se déplacer d'un cadre à l'autre ne redimensionne pas dynamiquement la fenêtre respective et conduit à un espace libre énorme dans de petits cadres. J'ai essayé différentes techniques pour rendre tous les cadres dans le conteneur redimensionnable dynamiquement, mais sans grand succès. Quelqu'un peut suggérer ce que je peux faire?

2
demandé sur Community 2016-03-14 18:06:48

1 réponses

au lieu d'empiler les cadres, assurez-vous qu'un seul soit jamais géré par grid à la fois. Vous pouvez le faire en appelant grid_remove() du cadre actuel et ensuite grid() sur le nouveau cadre. Ou, étant paresseux, vous pouvez appeler grid_remove() sur tout pour que vous n'ayez pas à vous rappeler quelle page est actuelle.

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()

Note: le redimensionnement automatique cessera de fonctionner si vous donnez à la fenêtre principale une taille fixe avec la méthode geometry sur la fenêtre racine, ou si l'utilisateur manuellement redimensionne la fenêtre. C'est parce que tkinter suppose que si quelque chose demande explicitement une taille de fenêtre, cette taille devrait être prise en compte.

si vous voulez toujours que la fenêtre se redimensionne, vous devez réinitialiser la géométrie à une chaîne vide. Vous pouvez ajouter ceci comme dernier énoncé dans la méthode show_frame :

frame.winfo_toplevel().geometry("")
2
répondu Bryan Oakley 2016-06-08 14:15:34