[PYTHON] Tkinter 프레임 크기 조정
PYTHONTkinter 프레임 크기 조정
나는이 접근 방식을 사용하여 동적으로 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.프레임을 스태킹하는 대신 한 번에 하나씩 그리드로 관리되도록하십시오. 현재 프레임의 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("")
from https://stackoverflow.com/questions/35991126/tkinter-frame-resize by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] Avro 스키마에 레코드를 중첩하는 방법은 무엇입니까? (0) | 2018.11.06 |
---|---|
[PYTHON] 객체를위한 팩토리 메소드 - 모범 사례? (0) | 2018.11.06 |
[PYTHON] 파이썬에서 주어진 문자열에 주어진 문자열에 문자열을 삽입하십시오. (0) | 2018.11.06 |
[PYTHON] 암호화 된 보안 도커 컨테이너 (0) | 2018.11.06 |
[PYTHON] Django : FormView에 동적 (비 모델) 데이터를 미리 채우는 방법은 무엇입니까? (0) | 2018.11.06 |