Tkinter의 Frame 위젯에 대하여 알아본다.
Frame 위젯은 레이아웃 관리를 유연하게 돕는다. Frame은 Tk() 가 생성한 root 윈도우에 포함된다. Frame 안에 Frame 을 포함시킬 수 있고, Frame 안에 Label이나 Button 을 포함시킬 수 있다. 물론 Frame을 사용하지 않아도 표현은 가능하다. 하지만 Frame을 사용하면 효율적인 구조를 짤 수 있다.
일종의 레이아웃 관리자라고 생각하면 된다. Java Swing에도 JPanel 같은게 있다. Tkinter 쪽은 아무래도 모바일이나 스마트폰 보다 PC 앱 개발을 위한 형태이다. (모바일 이전 시대에 PC를 기반으로 설계함) PC 앱 GUI는 비슷하다. 우리가 PC에서 쓰는 현시대 GUI 대부분 쉽게 쓸 수 있는 것은 어느정도는 표준화가 되어있기 때문이다.
프레임, 레이블, 버튼... 이런 위젯을 어떻게 배치하는가의 문제다. 위젯은 윈도우 컴포넌트와 유사한 개념이다.
<예제>
import tkinter as tk
root = tk.Tk()
root.geometry("320x240") # root 윈도우는 pack()이 필요없다.
root.title("Frame Test")
frame = tk.Frame(root, bd=5,bg='light blue', relief = 'groove') # 메인프레임
frame.pack()
l_frame = tk.Frame(root, bd=40,bg='white') # 왼쪽프레임
l_frame.pack(side=tk.LEFT)
r_frame = tk.Frame(root) # 오른쪽프레임
r_frame.pack(side=tk.RIGHT)
label = tk.Label(frame,text = 'Hello Tkinter!') # top 쪽에 올라감
label.pack()
button1 = tk.Button(l_frame,text='Button 1') # 기본형
button1.pack(padx = 10, pady = 10)
button2 = tk.Button(r_frame,text='Button 2' , bd = 5, bg = 'light blue',)
button2.pack(padx = 10, pady = 10)
button3 = tk.Button(l_frame,text='Button 3', bd = 5, bg = 'light green')
button3.pack(padx = 10, pady = 10)
button4 = tk.Button(r_frame,text='Button 4', relief = 'sunken')
button4.pack(padx = 10, pady = 10)
root.mainloop()
이제 tk.Tk() 가 왜 root인지 알 수 있다. root 뿌리가 되는 윈도우를 열고, 그 위에 Frame을 달고, Frame에 커스텀 Button 을 달고 Button의 command를 메소드나 함수에 연결시키는 방식으로 설계가 된다.
위의 예제는 Frame 구조를 보여 주기 위한 예제기 때문에 Button 에 함수를 연결하진 않았다. 그러나 쉽게 할 수 있다. 이벤트 처리기를 구현해야 하는 Java와는 다르다고 볼 수 있다.
세부 옵션들은 온라인 문서를 참조해야 한다. 역사가 오래된 오픈소스 GUI 라서 그런지 Python.org 쪽 자료보다 타 사이트의 리소스가 훨씬 많은 것 같다.
Tkinter 프레임 참조 링크 https://coderslegacy.com/python/python-gui/python-tkinter-frame/
Frame은 Tkinter의 뼈대를 세우는 구조로 바라보고 활용하면 좋다. 구조를 잘 짜놓으면 위젯들의 관리가 편하다.