본문 바로가기
프로그래밍/파이썬

[파이썬 GUI] tkinter 7 화면 전환~~ (Frame을 이용한 화면 전환)

by 인성패밀리 2022. 11. 24.
반응형

tkinter로 화면 전환에 대해서 궁금해 하시는 분들이 많이 있는 것 같습니다.

 

프로그램들을 실행시키다 보면 이전과 다음을 클릭하도록 되어있는 것을 종종 볼 수 있습니다.

 

그것과 같이 화면을 전환하는 방법에 대해서 알아보겠습니다.

 

화면을 전환하려면 우선 각 화면을 만들어야 합니다.

 

매번 하던 방식은

root = Tk()

Label(root, text="어쩌구" ...

 

이런 식으로 기본 화면에 만들었는데

 

이제는 각 화면을 따로따로 만들어주도록 하겠습니다. 그리고 버튼을 통해 이전과 다음 페이지로 넘어 갈 수 있도록 하겠습니다.

 

화면을 frame이라고 합니다. 그래서 Frame 위젯을 이용해야합니다.

이 Frame으로 각 화면을 만들어주도록 하겠습니다.

 

from tkinter import *

root = Tk()
root.title("화면 전환~~")
root.geometry("400x300+300+300")

frame1 = Frame(root, width=400, height=200)
frame2 = Frame(root, width=400, height=200)
frame3 = Frame(root, width=400, height=200)

but_frame = Frame(root, width=400, height=100)

root.mainloop()

근데 이렇게 만들기만 하면 나타날 수 없습니다. place, grid, pack 같은 것을 이용해야합니다.

 

여기서 주의할 점은 맨 먼저 나타나게 할 frame을 코드 상 가장 나중에 나타날 수 있도록 하는 것입니다.

from tkinter import *

root = Tk()
root.title("화면 전환~~")
root.geometry("400x300+300+300")

frame3 = Frame(root, width=400, height=200)
frame2 = Frame(root, width=400, height=200)
frame1 = Frame(root, width=400, height=200)
# 먼저 나올 프레임이 frame1이라서 가장 나중에 만듬

but_frame = Frame(root, width=400, height=100)

frame3.place(x=0, y=0)
frame2.place(x=0, y=0)
frame1.place(x=0, y=0)  # 이 프레임이 가장 먼저 나타남
but_frame.place(x=0, y=200)  # 밑 바닥에 이전과 다음이 있을 버튼 영역

root.mainloop()

근데 이렇게 하면 화면이 전환 버튼도 안보이고 이게 무슨 프레임이 나온 것인지 보이지 않습니다.

간단한 label과 button을 추가합니다.

 

from tkinter import *

page = 1  # frame1이 1임, frame2는 2 frame3은 3
def next_frame():
    global page, frame1, frame2, frame3
    page += 1
    if page >= 3:
        page = 3
        frame3.lift()
    elif page == 2:
        frame2.lift()
    elif page == 1:
        frame1.lift()


def prev_frame():
    global page, frame1, frame2, frame3
    page -= 1
    if page <= 1:
        page = 1
        frame1.lift()
    elif page == 2:
        frame2.lift()
    elif page == 3:
        frame3.lift()


root = Tk()
root.title("화면 전환~~")
root.geometry("400x300+300+300")

frame3 = Frame(root, relief='solid', border=2)
frame2 = Frame(root, relief='solid', border=2)
frame1 = Frame(root, relief='solid', border=2)

but_frame = Frame(root, relief='solid', border=2)

frame3.place(x=0, y=0, width=400, height=250)
frame2.place(x=0, y=0, width=400, height=250)
frame1.place(x=0, y=0, width=400, height=250)  # 이 프레임이 가장 먼저 나타남
but_frame.place(x=0, y=250, width=400, height=50)  # 밑 바닥에 이전과 다음이 있을 버튼 영역

Label(frame3, text="Frame3", font=('consolas', 20)).pack(fill='y')
Label(frame2, text="Frame2", font=('consolas', 20)).pack(fill='y')
Label(frame1, text="Frame1", font=('consolas', 20)).pack(fill='y')

Button(but_frame, text='다음', command=next_frame).pack(side='right')
Button(but_frame, text='이전', command=prev_frame).pack(side='right')

root.mainloop()

화면 전환에 대한 핵심 코드는 함수 부분에 있는 lift 메소드입니다.

어떤 프레임에 대해서 lift 메소드를 사용하면 그 화면으로 전환할 수 있습니다.

 

화면 전환을 해도 이전에 입력한 값들은 남아있습니다.

 

도움이 되셨길 바랍니다. 감사합니다.

반응형

댓글