파이썬(Python)

[ CustomTkinter ] CustomTkinter 새 창 띄우기, 새로운 창 열기, 새 창 만들기

카루루1007 2024. 11. 1. 13:59
728x90
반응형

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()

 

이렇게 하면 새 창이 나타났을 때

메인창을 이동할 수는 있지만, 다른 조작은 불가능하게 됩니다.

 

728x90

 새 창이 나타났을 때 메인창은 숨기기

 

먼저 새 창이 나타날 때

즉, 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) : 새 창이 메인창 위에 오게 한다.

여기를 방문하시면 더 많은 파이썬 관련 자료를 확인할 수 있습니다.

파이썬 공부하기

728x90
반응형