어떤 윈도우 프로그램은 시작할 때 DB가 존재하지 않아 DB를 생성하고 데이터를 업데이트 하는데 일정 시간이 걸린다면 그것을 표시해주는 윈도우를 출력하려고 한다. 이때 DB 업데이트 정보를 출력하는 윈도우가 실행되는 동안 메인 윈도우는 제어를 하지 말아야 한다.
이 프로그램의 윈도우는 아래와 같이 동작을 해야 한다.
- 두 개의 윈도우을 실행할 수 있으며, 두 개의 윈도우는 종속 관계가 있다.
- 서브 윈도우가 생성될 경우, 메인 윈도우의 제어가 중단되고 프로그램의 제어권은 서브 윈도우 갖는다.
- 서브 윈도우가 종료되야 메인 윈도우가 제어권을 가질 수 있다.
- 메인 윈도우가 종료되면 서브 윈도우도 함께 종료되어 한다.
아래 글과 같이 VC++ Modal Dialog와 같은 기능을 하는 윈도우(프레임)을 생성하려고 한다.
파이썬의 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()로 생성하면 메인 윈도우와 완전 독립된 윈도우로 생성되어 메인 윈도우가 종료되어도 서브 윈도우는 종료되지 않고 실행된 상태를 유지한다.