CustonTkinter 라이브러리를 활용하여
새로운 창을 여는 간단한 멀티 윈도우 애플리케이션을 구현하는 방법을 알아보겠습니다.
기본 창 만들기
먼저 간단하게 메인 창을 하나 만드는 코드입니다.
import customtkinter as ctk
root = ctk.CTk()
root.geometry("400x300")
root.title("Main Window")
button = ctk.CTkButton(root, text="Open New Window")
button.pack(pady=50)
root.mainloop()
결과는 아래와 같이 메인 창에 버튼이 하나 생성되었습니다.
새 창 띄우기
메인창의 버튼을 눌렀을 때 새 창을 띄우는 코드입니다.
메인 창에서 버튼을 눌렀을 때 호출할 함수를 정의합니다.
이 함수가 호출 되면 새로운 창이 생성됩니다.
CTKToplevel() 함수를 사용하며, mainloop()를 사용하지 않는 것이 특징입니다.
def open_new_window():
new_window = ctk.CTkToplevel(root)
new_window.geometry("300x200")
new_window.title("New Window")
new_button = ctk.CTkButton(new_window, text="New Button")
new_button.pack(pady=20)
그리고 메인 창의 버튼에 open_new_window() 함수를 연결합니다.
button = ctk.CTkButton(root, text="Open New Window", command=open_new_window)
전체코드입니다.
import customtkinter as ctk
root = ctk.CTk()
root.geometry("400x300")
root.title("Main Window")
def open_new_window():
new_window = ctk.CTkToplevel(root)
new_window.geometry("300x200")
new_window.title("New Window")
new_button = ctk.CTkButton(new_window, text="New Button")
new_button.pack(pady=20)
button = ctk.CTkButton(root, text="Open New Window", command=open_new_window)
button.pack(pady=50)
root.mainloop()
이 코드를 실행하면 아래 그림과 같이 메인 창이 나타나고
메인 창의 버튼을 눌렀을 때 새로운 창이 나타납니다.
새 창이 메인 윈도우 위에 나타나게 하기
새 창이 메인 윈도우의 위에 나타나게 하려면 아래 코드 한 줄을 추가하면 됩니다.
new_window.attributes("-topmost", True)
이제 메인 윈도우의 버튼을 누르면 새 창이 메인 윈도우의 위에 나타나고
활성화됩니다.
추가로 새 창이 생성되는 위치를 메인 윈도우의 중앙에 위치하게 하려면
아래와 같이 코드를 추가하면 됩니다.
root_x = root.winfo_x()
root_y = root.winfo_y()
root_width = root.winfo_width()
root_height = root.winfo_height()
new_x = root_x + (root_width // 2) - 150 # 150은 새 창 너비의 반
new_y = root_y + (root_height // 2) - 100 # 100은 새 창 높이의 반
new_window.geometry(f"+{new_x}+{new_y}")
여기까지의 전체 코드입니다.
import customtkinter as ctk
root = ctk.CTk()
root.geometry("400x300")
root.title("Main Window")
def open_new_window():
new_window = ctk.CTkToplevel(root)
new_window.geometry("300x200")
new_window.title("New Window")
new_window.attributes("-topmost", True)
root_x = root.winfo_x()
root_y = root.winfo_y()
root_width = root.winfo_width()
root_height = root.winfo_height()
new_x = root_x + (root_width // 2) - 150 # 150은 새 창 너비의 반
new_y = root_y + (root_height // 2) - 100 # 100은 새 창 높이의 반
new_window.geometry(f"+{new_x}+{new_y}")
new_button = ctk.CTkButton(new_window, text="New Button")
new_button.pack(pady=20)
button = ctk.CTkButton(root, text="Open New Window", command=open_new_window)
button.pack(pady=50)
root.mainloop()
새 창이 열렸을 때 메인 창 조작하지 못하게 하기
새 창이 열렸을 때 메인 창을 조작하지 못하게 하려면
아래 코드를 추가하면 됩니다.
new_window.grab_set()
이렇게 하면 새 창이 나타났을 때
메인창을 이동할 수는 있지만, 다른 조작은 불가능하게 됩니다.
새 창이 나타났을 때 메인창은 숨기기
먼저 새 창이 나타날 때
즉, open_new_window() 함수가 호출될 때
withdraw() 함수를 사용해 메인 창을 숨깁니다.
root.withdraw()
그다음 새 창이 닫힐 때 메인 창을 다시 나타나게 해야 합니다.
먼저 새 창이 닫혔을 때 호출 될 함수를 정의합니다.
def on_closing():
root.deiconify()
new_window.destroy()
deiconify()는 메인 창을 다시 보이게 하는 기능을 합니다.
destory()는 창을 종료하는 함수로, 새 창을 종료하는 기능을 합니다.
그 다음 protocol 함수를 사용해 새 창의 x 버튼이 눌렸을 때
on_closing() 함수가 호출이 되면 됩니다.
new_window.protocol("WM_DELETE_WINDOW", on_closing)
지금까지의 전체 코드입니다.
import customtkinter as ctk
root = ctk.CTk()
root.geometry("400x300")
root.title("Main Window")
def open_new_window():
root.withdraw()
def on_closing():
root.deiconify()
new_window.destroy()
new_window = ctk.CTkToplevel(root)
new_window.geometry("300x200")
new_window.title("New Window")
new_window.grab_set()
new_window.attributes("-topmost", True)
root_x = root.winfo_x()
root_y = root.winfo_y()
root_width = root.winfo_width()
root_height = root.winfo_height()
new_x = root_x + (root_width // 2) - 150 # 150은 새 창 너비의 반
new_y = root_y + (root_height // 2) - 100 # 100은 새 창 높이의 반
new_window.geometry(f"+{new_x}+{new_y}")
new_button = ctk.CTkButton(new_window, text="New Button")
new_button.pack(pady=20)
new_window.protocol("WM_DELETE_WINDOW", on_closing)
button = ctk.CTkButton(root, text="Open New Window", command=open_new_window)
button.pack(pady=50)
root.mainloop()
정리
withdraw() : 창을 숨긴다.(작업표시줄, 트레이아이콘에도 나타나지 않음)
deiconify() : 창을 다시 보여준다.
grab_set() : 새 창이 열렸을 때 메인 창을 조작하지 못하게 한다.
new_window.attributes("-topmost", True) : 새 창이 메인창 위에 오게 한다.
여기를 방문하시면 더 많은 파이썬 관련 자료를 확인할 수 있습니다.
'파이썬(Python)' 카테고리의 다른 글
[ Selenium ] 크롬 브라우저 실행 시 내 정보를 유지한 채로 브라우저 띄우기 (3) | 2024.11.06 |
---|---|
[ Selenium ] CSS Selector(CSS 셀렉터)를 사용하여 웹 페이지 요소 찾기 (0) | 2024.11.05 |
[ openpyxl ] 엑셀 파일 불러오기, load_workbook() 함수 (0) | 2024.10.30 |
[ pynput ] 파이썬(Python) pynput에서 사용할 수 있는 특수키 목록 (0) | 2024.10.29 |
[ CustomTkinter ] 파이썬 GUI 탭 뷰 만들기, 탭 만들기 (0) | 2024.10.25 |