Tkinter Modal Dialog 설정

어떤 윈도우 프로그램은 시작할 때 DB가 존재하지 않아 DB를 생성하고 데이터를 업데이트 하는데 일정 시간이 걸린다면 그것을 표시해주는 윈도우를 출력하려고 한다. 이때 DB 업데이트 정보를 출력하는 윈도우가 실행되는 동안 메인 윈도우는 제어를 하지 말아야 한다.

 

이 프로그램의 윈도우는 아래와 같이 동작을 해야 한다.

  • 두 개의 윈도우을 실행할 수 있으며, 두 개의 윈도우는 종속 관계가 있다.
  • 서브 윈도우가 생성될 경우, 메인 윈도우의 제어가 중단되고 프로그램의 제어권은 서브 윈도우 갖는다.
  • 서브 윈도우가 종료되야 메인 윈도우가 제어권을 가질 수 있다.
  • 메인 윈도우가 종료되면 서브 윈도우도 함께 종료되어 한다.

아래 글과 같이 VC++ Modal Dialog와 같은 기능을 하는 윈도우(프레임)을 생성하려고 한다.

 

[MFC] Modeless Dialog(모달리스/모델리스 대화상자)

Modeless Dialog(모달리스/모델리스 대화상자) 1. Modal 과 Modeless Modal은 대화상자가 출력되고 있...

blog.naver.com

파이썬의 Tkinter 모듈을 사용하여 VC++ Modal Dialog 방식으로 서브 윈도우를 생성하려면 윈도우(프레임)을 grab_set으로 설정해야 한다.

import tkinter

def create_window():
    # sub = tkinter.Tk()
    sub = tkinter.Toplevel(main)
    sub.resizable(0, 0)
    sub.geometry('200x200+150+150')
    sub.title('Sub Windows')

    sub.attributes('-topmost', 'true')
    sub.grab_set()

main = tkinter.Tk()
main.resizable(0, 0)
main.geometry('400x300+100+100')
main.title('Main Windows')
tkinter.Button(main, text='New window', command=create_window).pack()

main.mainloop()

윈도우 속성은 OS에 따라 차이가 있다. 윈도우에서는 '-disabled' 설정이 가능하지만 리눅스 계열에서는 사용할 수 없다.

윈도우의 grab_set 설정으로 Modal 방식으로 동작은 하지만, 메인 윈도우 클릭시 서브 윈도우가 가려지는 문제가 있어, '-topmost' 속성을 추가하였다. '-topmost' 속성은 윈도우를 항상 화면 최상위에 출력되도록 한다.

 

그리고 서브 윈도우를 tkinter.TopLevel()이 아닌 tkinter.Tk()로 생성하면 메인 윈도우와 완전 독립된 윈도우로 생성되어 메인 윈도우가 종료되어도 서브 윈도우는 종료되지 않고 실행된 상태를 유지한다.