Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python Tkinter – 루트 창을 기준으로 Toplevel 위젯을 배치하는 방법

Tkinter에서 Toplevel 위젯은 팝업 모달 창을 만들 때 사용됩니다. Toplevel로 생성한 팝업 창은 tkinter 애플리케이션의 기본 창과 거의 같은 방식으로 동작하며, 그 안에는 텍스트 위젯, 버튼, 캔버스, 프레임 등 다양한 위젯을 자유롭게 배치할 수 있습니다.

Toplevel 창의 크기와 위치는 화면 전체를 기준으로 유연하게 조절할 수 있으며, 이 창에 담긴 모든 위젯은 항상 다른 창들보다 위에 표시됩니다.

root.winfo_x()root.winfo_y() 메서드를 사용하면 루트 창의 현재 x, y 좌표를 얻을 수 있습니다. 이 좌표를 활용해 geometry 메서드로 Toplevel 위젯을 루트 창을 기준으로 상대적인 위치에 배치할 수 있습니다. 루트 창을 기준으로 위치를 지정하면 두 창이 서로 겹치는 것을 방지하고 분리된 상태로 나타나므로, 사용자 경험 측면에서도 훨씬 깔끔한 결과를 얻을 수 있습니다.

예제 코드

# 필요한 라이브러리 임포트
from tkinter import *

# tkinter 프레임(창) 인스턴스 생성
win = Tk()

# 창 크기 및 제목 설정
win.geometry("700x300")
win.title("Root Window")

# Toplevel 창 생성
top = Toplevel(win)
top.geometry("400x200")

# Toplevel 위젯에 레이블 추가
Label(top, text="This is a Toplevel window", font="Calibri, 12").pack()

# 루트 창의 현재 좌표 가져오기
x = win.winfo_x()
y = win.winfo_y()

# 루트 창 좌표에 오프셋을 더해 Toplevel 창 배치
top.geometry("+%d+%d" % (x + 200, y + 200))

# Toplevel 창을 루트 창 앞쪽에 유지
top.wm_transient(win)

top.mainloop()

핵심 메서드 정리

  • winfo_x(), winfo_y() : 루트 창이 화면상에 위치한 현재 x, y 좌표를 픽셀 단위로 반환합니다.
  • geometry("+X+Y") : 창을 지정한 화면 좌표에 배치합니다. 예제에서는 루트 창 좌표에 각각 200픽셀의 오프셋을 더해 두 창이 겹치지 않도록 처리했습니다.
  • wm_transient(win) : 해당 Toplevel 창을 루트 창의 보조 창으로 지정하여, 작업 표시줄에 별도 항목이 생기지 않고 항상 부모 창 앞쪽에 표시되도록 합니다.

실행 결과

위 코드를 실행하면 메인(루트) 창 오른쪽 아래 방향으로 일정 간격만큼 떨어진 위치에 별도의 Toplevel 창이 함께 나타납니다. 루트 창을 화면 어디로 옮기더라도 Toplevel 창은 루트 창을 기준으로 상대적인 위치에 배치되어 두 창이 겹치지 않습니다.

Python Tkinter – 루트 창을 기준으로 Toplevel 위젯을 배치하는 방법