윈도우 프로그램 위젯 그룹핑

강의노트 Menu

강의노트 • 조회수 56 • 댓글 0 • 작성 1개월 전 • 수정 4주 전  
  • menu

프로그램의 메뉴바와 드롭다운 메뉴를 구현할 때 사용한다.

메뉴 항목으로는 command, checkbutton, radiobutton, cascade를 제공한다.

메뉴를 작성하는 방법은 파이썬같이 직관적이지 않은데 이는 tkinter의 프로그램 방식이기 때문이다.

메뉴를 쉽게 작성하는 방법은 다음 기본 구조와 같이

  • 메뉴바를 생성한다.
  • 메뉴바 항목의 드롭다운 메뉴 들을 만든다. (File, Edit, Help)
  • 메뉴바에 메뉴를 추가한다.

기본 구조

import tkinter as tk
from tkinter import ttk

def new_file():
    print("새 파일 생성!")

def open_file():
    print("파일 열기!")

root = tk.Tk()
root.title("Menu 기본 예제")
root.geometry("300x200")

# 1. 메뉴바 생성
menubar = tk.Menu(root)
root.config(menu=menubar)

# 2. File 메뉴
file_menu = tk.Menu(menubar, tearoff=0)  # tearoff=0 → 분리선 제거
file_menu.add_command(label="New", command=new_file)
file_menu.add_command(label="Open", command=open_file)
file_menu.add_separator()  # 구분선
file_menu.add_command(label="Exit", command=root.quit)

# Edit 메뉴
edit_menu = tk.Menu(menubar, tearoff=0)
edit_menu.add_command(label="Undo")
edit_menu.add_command(label="Redo")

# Help 메뉴
help_menu = tk.Menu(menubar, tearoff=0)
help_menu.add_command(label="About", command=lambda: print("About 클릭"))

# 3. 메뉴바에 메뉴 추가
menubar.add_cascade(label="File", menu=file_menu)
menubar.add_cascade(label="Edit", menu=edit_menu)
menubar.add_cascade(label="Help", menu=help_menu)

root.mainloop()

메뉴 속성

속성 설명
tearoff 메뉴를 분리할 수 있는 점선 표시 여부 (0: 비활성화, 1: 활성화)
add_command 일반 메뉴 항목 추가
add_separator 구분선 추가
add_cascade 하위 메뉴 연결
add_checkbutton 체크 박스 형태 메뉴
add_radiobutton 라디오버튼 형태 메뉴

tearoff가 1인 경우

예제

체크 버튼 . 라디오 버튼 메뉴 예제

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title("Menu 기본 예제")
root.geometry("300x200")

# 메뉴바 생성
menubar = tk.Menu(root)
root.config(menu=menubar)

# 변수 지정
check_var1 = tk.BooleanVar()
check_var2 = tk.BooleanVar()
radio_var = tk.StringVar(value="Option1")

# View 메뉴
view_menu = tk.Menu(menubar, tearoff=0)
view_menu.add_checkbutton(label="check 1", variable=check_var1)
view_menu.add_checkbutton(label="check 2", variable=check_var2)
view_menu.add_separator()
view_menu.add_radiobutton(label="radio 1", variable=radio_var, value="Option1")
view_menu.add_radiobutton(label="radio 2", variable=radio_var, value="Option2")

#메뉴바에 추가
menubar.add_cascade(label="View", menu=view_menu)

root.mainloop()

설명 :

체크 버튼 메뉴는 각 체크 버튼별 변수를 가져야 한다.

라디오버튼 메뉴는 같은 그룹에 있는 라디오 버튼 메뉴는 하나만 선택된다.

스타일 변경

기본 예제에 다음 명령어를 추가한다.

file_menu.configure(background='#333', foreground="white", activebackground='#555',activeforeground='red')

이미지 아이콘이 있는 메뉴

여기서 사용한 아이콘은 폴더 열기 아이콘 제작자: kmg design - Flaticon 의 것을 사용하였다.

시작전에 파일 열기 아이콘을 kmd design에서 다운받은 것을 프로그램과 같은 위치에 open.png로 저장한다.

from PIL import Image, ImageTk #1

original_image = Image.open("open.png")  # 2
resized_image = original_image.resize((15, 15)) #3
open_image = ImageTk.PhotoImage(resized_image) #4

file_menu.add_command(label="Open", image=open_image, compound="left", command=open_file) #5

설명 :

  1. PIL 모듈을 설치하고 임포트한다.
  2. 이미지를 읽어서 original_image에 넣어두고
  3. 이 이미지의 크기를 (15,15)로 변경한다.
  4. 사이즈가 변경된 이미지를 tkinter가 읽어 들일수 있도록 Image.PhotoImage로 변경한다.
  5. file_menu에 이미지를 읽어 들이도록 설정한다.

연습문제

  1. 메뉴바에 Tools 메뉴를 추가하고, Settings 클릭 시 "환경설정" 메시지 출력한다. 정답 :
import tkinter as tk
from tkinter import messagebox

def show_settings():
    messagebox.showinfo("Settings", "환경설정")

root = tk.Tk()
root.title("Menu Example")

menubar = tk.Menu(root)

# Tools 메뉴
tools_menu = tk.Menu(menubar, tearoff=0)
tools_menu.add_command(label="Settings", command=show_settings)
menubar.add_cascade(label="Tools", menu=tools_menu)

root.config(menu=menubar)
root.mainloop()
  1. View 메뉴에 Dark Mode 체크박스 메뉴 추가, 클릭 시 상태 출력한다. 정답 :
import tkinter as tk

def toggle_darkmode():
    state = dark_mode_var.get()
    if state:
        print("Dark Mode: ON")
    else:
        print("Dark Mode: OFF")

root = tk.Tk()
root.title("Menu Example")

menubar = tk.Menu(root)

# View 메뉴
view_menu = tk.Menu(menubar, tearoff=0)
dark_mode_var = tk.BooleanVar()
view_menu.add_checkbutton(label="Dark Mode", variable=dark_mode_var, command=toggle_darkmode)
menubar.add_cascade(label="View", menu=view_menu)

root.config(menu=menubar)
root.mainloop()
  1. Help 메뉴에 Guide와 About 추가, 클릭 시 각각 "사용 설명서", "버전 정보" 출력한다. 정답 :
import tkinter as tk
from tkinter import messagebox

def show_guide():
    messagebox.showinfo("Guide", "사용 설명서")

def show_about():
    messagebox.showinfo("About", "버전 정보")

root = tk.Tk()
root.title("Menu Example")

menubar = tk.Menu(root)

# Help 메뉴
help_menu = tk.Menu(menubar, tearoff=0)
help_menu.add_command(label="Guide", command=show_guide)
help_menu.add_command(label="About", command=show_about)
menubar.add_cascade(label="Help", menu=help_menu)

root.config(menu=menubar)
root.mainloop()
  1. File 메뉴에 아이콘과 함께 New 추가 (왼쪽에 아이콘 표시)한다. 정답 :
import tkinter as tk
from tkinter import messagebox

def new_file():
    messagebox.showinfo("New", "새 파일 생성")

root = tk.Tk()
root.title("Menu Example")

menubar = tk.Menu(root)

# 아이콘 준비 (작은 크기 GIF/PNG 권장)
icon = tk.PhotoImage(width=16, height=16)  
# 단순 예시용 (빈 아이콘)

# File 메뉴
file_menu = tk.Menu(menubar, tearoff=0)
file_menu.add_command(label="New", image=icon, compound="left", command=new_file)
menubar.add_cascade(label="File", menu=file_menu)

root.config(menu=menubar)
root.mainloop()
이전 글
다음 글
댓글
댓글로 소통하세요.