복붙노트

[PYTHON] Tkinter 프레임 크기 조정

PYTHON

Tkinter 프레임 크기 조정

나는이 접근 방식을 사용하여 동적으로 TKInter에서 프레임의 크기를 조정할 수있는 방법을 찾기 위해 며칠 동안 노력했습니다.

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

tkinter의 두 프레임 사이에서 Switch의 코드를 복사했습니다. 동일한 접근법을 따르고 있기 때문입니다.

내가 직면하고있는 문제는이 방법을 사용하면 모든 프레임이 컨테이너에 쌓여 있고이 컨테이너의 크기가 가장 큰 프레임의 크기라는 것입니다. 한 프레임에서 다른 프레임으로 이동해도 각 창의 크기가 동적으로 조정되지 않고 작은 프레임에 큰 여유 공간이 생깁니다. 컨테이너의 모든 프레임을 동적으로 크기 조정할 수 있지만 성공하지 못하게하는 여러 가지 기법을 시도했습니다. 누군가 내가 할 수있는 것을 제안 할 수 있습니까?

해결법

  1. ==============================

    1.프레임을 스태킹하는 대신 한 번에 하나씩 그리드로 관리되도록하십시오. 현재 프레임의 grid_remove ()를 호출 한 다음 새 프레임에서 grid ()를 호출하여이 작업을 수행 할 수 있습니다. 또는 게으른 경우 모든 페이지에서 grid_remove ()를 호출하여 현재 페이지가 어떤 것인지 기억할 필요가 없습니다.

    프레임을 스태킹하는 대신 한 번에 하나씩 그리드로 관리되도록하십시오. 현재 프레임의 grid_remove ()를 호출 한 다음 새 프레임에서 grid ()를 호출하여이 작업을 수행 할 수 있습니다. 또는 게으른 경우 모든 페이지에서 grid_remove ()를 호출하여 현재 페이지가 어떤 것인지 기억할 필요가 없습니다.

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

    참고 : 루트 창에서 지오메트리 메서드를 사용하여 기본 창에 고정 크기를 지정하거나 사용자가 창 크기를 수동으로 조정하면 자동 크기 조정이 작동하지 않습니다. 이는 tkinter가 무언가가 명시 적으로 윈도우 크기를 요청하면 그 크기가 존중되어야한다고 가정하기 때문입니다.

    항상 창 크기를 조정하려면 기하학을 빈 문자열로 재설정해야합니다. 이것을 show_frame 메소드의 마지막 문장으로 추가 할 수 있습니다 :

    frame.winfo_toplevel().geometry("")
    
  2. from https://stackoverflow.com/questions/35991126/tkinter-frame-resize by cc-by-sa and MIT license