Tkinter는 파이썬(Python)에서 GUI 애플리케이션을 구축하기 위한 대표적인 표준 라이브러리입니다. 이 글에서는 클릭 한 번으로 펼치거나 접을 수 있는 접이식 패널(Collapsible Pane)을 만드는 방법을 알아보겠습니다.
접이식 패널은 많은 양의 데이터를 GUI 캔버스에 표시해야 하지만, 그 내용을 항상 화면에 노출하고 싶지 않은 경우에 특히 유용합니다. 필요할 때만 펼쳐서 정보를 보여주고, 평소에는 접어두어 화면 공간을 깔끔하고 효율적으로 활용할 수 있기 때문입니다.
아래 프로그램은 접이식 패널을 생성하며, 화살표를 클릭해 패널을 펼쳤을 때와 접었을 때의 두 가지 결과를 모두 확인할 수 있습니다. 코드의 주석에는 각 단계별 접근 방식이 설명되어 있습니다.
예제 코드
from tkinter import *
import tkinter as tk
from tkinter import ttk
from tkinter.ttk import *
class cpane(ttk.Frame):
def __init__(self, MainWindow, expanded_text, collapsed_text):
ttk.Frame.__init__(self, MainWindow)
# 클래스 변수 정의
self.MainWindow = MainWindow
self._expanded_text = expanded_text
self._collapsed_text = collapsed_text
# weight=1로 설정하여 필요에 따라 크기가 늘어나도록 함
self.columnconfigure(1, weight=1)
self._variable = tk.IntVar()
# 체크버튼 생성
self._button = ttk.Checkbutton(self, variable=self._variable,
command=self._activate, style="TButton")
self._button.grid(row=0, column=0)
# 가로 구분선 생성
self._separator = ttk.Separator(self, orient="horizontal")
self._separator.grid(row=0, column=1, sticky="we")
self.frame = ttk.Frame(self)
# 클래스 활성화
self._activate()
def _activate(self):
if not self._variable.get():
# 버튼이 눌리면 해당 위젯 제거
self.frame.grid_forget()
# 접힌 상태의 텍스트 표시
self._button.configure(text=self._collapsed_text)
elif self._variable.get():
# 필요에 따라 프레임 영역 확장
self.frame.grid(row=1, column=0, columnspan=2)
self._button.configure(text=self._expanded_text)
def toggle(self):
self._variable.set(not self._variable.get())
self._activate()
# 루트 윈도우(메인 윈도우) 생성
root = Tk()
root.geometry('300x300')
# 접이식 패널 컨테이너 객체 생성
cpane_obj = cpane(root, 'Close Me', 'Open Me!')
cpane_obj.grid(row=0, column=0)
# 접이식 패널 안에 표시될 버튼들
b = Button(cpane_obj.frame, text=" Frame Expanded").grid(
row=1, column=2, pady=20)
b = Checkbutton(cpane_obj.frame, text="Hi There ! How are you doing?").grid(
row=3, column=4, pady=20)
mainloop()주요 동작 원리
이 코드가 작동하는 방식을 간단히 살펴보면 다음과 같습니다.
1. cpane 클래스 구조
cpane 클래스는 ttk.Frame을 상속받아 하나의 재사용 가능한 접이식 컨테이너 위젯을 구현합니다. 생성자는 메인 윈도우와 함께 펼쳤을 때 표시할 텍스트(expanded_text)와 접었을 때 표시할 텍스트(collapsed_text)를 인자로 받습니다.
2. 토글 버튼 역할의 체크버튼
ttk.Checkbutton을 버튼 스타일로 적용하여 토글 버튼처럼 사용합니다. 체크 상태는 tk.IntVar() 변수에 저장되며, 상태가 변경될 때마다 _activate() 메서드가 호출됩니다.
3. 패널 열기와 닫기
_activate() 메서드는 변수 값을 기준으로 패널의 상태를 결정합니다. 값이 0이면 grid_forget()을 호출해 내부 프레임을 화면에서 제거하고 접힌 상태의 텍스트를 표시하며, 값이 1이면 grid()로 프레임을 다시 배치하여 영역을 확장합니다.
4. 외부에서 상태 전환하기
toggle() 메서드를 사용하면 사용자의 클릭 없이도 프로그래밍 방식으로 패널을 열거나 접을 수 있어, 다른 위젯과 연동한 자동화 처리에도 활용할 수 있습니다.
실행 결과
위 코드를 실행하면 다음과 같은 결과를 확인할 수 있습니다.

