# main.py
import tkinter as tk
from tkinter import ttk
import random
class MainApplication:
def __init__(self, root):
self.root = root
self.root.title("메인 창")
self.root.geometry("400x300")
# 단순하고 현대적인 모양을 위한 스타일
style = ttk.Style()
style.configure('Modern.TButton',
padding=10,
font=('Helvetica', 10))
self.header = ttk.Label(
root,
text="Toplevel 창 데모",
font=('Helvetica', 16, 'bold'),
padding=20
)
self.header.pack()
self.create_buttons()
self.child_windows = []
self.center_window(self.root)
def create_buttons(self):
buttons_frame = ttk.Frame(self.root, padding="20")
buttons_frame.pack(fill=tk.BOTH, expand=True)
ttk.Button(
buttons_frame,
text="기본 창 열기",
style='Modern.TButton',
command=self.create_basic_window
).pack(pady=5, fill=tk.X)
ttk.Button(
buttons_frame,
text="모달 창 열기",
style='Modern.TButton',
command=self.create_modal_window
).pack(pady=5, fill=tk.X)
ttk.Button(
buttons_frame,
text="위치 지정 창 열기",
style='Modern.TButton',
command=self.create_positioned_window
).pack(pady=5, fill=tk.X)
ttk.Button(
buttons_frame,
text="임시 창 열기",
style='Modern.TButton',
command=self.create_transient_window
).pack(pady=5, fill=tk.X)
def create_basic_window(self):
window = tk.Toplevel(self.root)
window.title("기본 창")
window.geometry("300x200")
ttk.Label(
window,
text="이것은 기본적인 Toplevel 창입니다",
padding=20
).pack()
ttk.Button(
window,
text="닫기",
command=window.destroy
).pack(pady=10)
self.child_windows.append(window)
window.protocol("WM_DELETE_WINDOW",
lambda: self.cleanup_window(window))
def create_modal_window(self):
window = tk.Toplevel(self.root)
window.title("모달 창")
window.geometry("300x200")
# 모달로 만들기
window.grab_set()
window.transient(self.root)
ttk.Label(
window,
text="이 창은 닫아야\n메인 창을 사용할 수 있습니다",
padding=20
).pack()
ttk.Button(
window,
text="닫기",
command=window.destroy
).pack(pady=10)
def create_positioned_window(self):
window = tk.Toplevel(self.root)
window.title("위치 지정 창")
window.geometry("300x200")
# 화면에 무작위 위치 지정
x = random.randint(0, self.root.winfo_screenwidth() - 300)
y = random.randint(0, self.root.winfo_screenheight() - 200)
window.geometry(f"+{x}+{y}")
ttk.Label(
window,
text="이 창은 무작위 위치에 나타납니다",
padding=20
).pack()
ttk.Button(
window,
text="닫기",
command=window.destroy
).pack(pady=10)
self.child_windows.append(window)
window.protocol("WM_DELETE_WINDOW",
lambda: self.cleanup_window(window))
def create_transient_window(self):
window = tk.Toplevel(self.root)
window.title("임시 창")
window.geometry("300x200")
# 메인 창 위에 항상 유지되도록 하기
window.transient(self.root)
ttk.Label(
window,
text="이 창은 항상\n메인 창 위에 유지됩니다",
padding=20
).pack()
ttk.Button(
window,
text="닫기",
command=window.destroy
).pack(pady=10)
self.child_windows.append(window)
window.protocol("WM_DELETE_WINDOW",
lambda: self.cleanup_window(window))
def cleanup_window(self, window):
if window in self.child_windows:
self.child_windows.remove(window)
window.destroy()
def center_window(self, window):
window.update_idletasks()
width = window.winfo_width()
height = window.winfo_height()
x = (window.winfo_screenwidth() // 2) - (width // 2)
y = (window.winfo_screenheight() // 2) - (height // 2)
window.geometry(f'+{x}+{y}')
if __name__ == "__main__":
root = tk.Tk()
app = MainApplication(root)
root.mainloop()