본문 바로가기
GUI 튜토리얼/tkinter 한꼬집씩만 따라해보기

25. 메뉴바의 종료버튼으로 프로그램 종료하기

by 일코 2022. 11. 20.

지난 포스팅

2022.11.20 - [기타/tkinter 한꼬집씩만 따라해보기] - 24. 상단에 메뉴바 붙이기

 

24. 상단에 메뉴바 붙이기

지난 포스팅 2022.11.20 - [기타/tkinter 한꼬집씩만 따라해보기] - 23. 프레임 안의 위젯들 속성을 일괄변경하기 23. 프레임 안의 위젯들 속성을 일괄변경하기 지난 포스팅 2022.11.20 - [기타/tkinter 한꼬집

martinii.fun


 

이번 포스팅에서는 : 메뉴바 종료버튼으로 프로그램 종료

지난 시간에는 tkinter GUI에 메뉴바를 만드는 방법을 간단히 보여드렸습니다.

각 메뉴버튼을 눌렀을 때 어떤 동작을 할지는 함수로 만들고 command 인자로 넣으면 되는데,

이번에는 그 과정을 "종료" 기능을 만들어보면서 배워봅시다.

코드가 짧으니 먼저 한 번 읽어보시기 바랍니다.

import tkinter as tk
from tkinter import Menu


def 종료():
    win.destroy()
    win.quit()
    exit()


win = tk.Tk()

메뉴바 = Menu(win)
win.config(menu=메뉴바)

파일 = Menu(master=메뉴바, tearoff=False)
메뉴바.add_cascade(label="파일", menu=파일)

파일.add_command(label="종료", command=종료)

win.mainloop()

간단하게 파일-종료 메뉴만 만들어보았습니다.

실행해보면

코드를 간략히 설명드리겠습니다.

def 종료():
    win.destroy()
    win.quit()
    exit()

가장 먼저 정의된 콜백함수인 종료는 destroy와 quit 및 exit를 차례대로 실행합니다.

win.destroy의 메서드주석을 보면 이렇게 씌어 있습니다.

Destroy this and all descendants widgets. This will end the application of this Tcl interpreter.
"해당 위젯과 자손 위젯을 모두 제거한다. 이 Tck인터프리터의 애플리케이션을 끝낸다."

destroy 메서드는 인터프리터는 종료하지 않는다는 걸 알 수 있습니다.

반면 win.quit 의 메서드 주석은 아래와 같이 씌어 있습니다.

Quit the Tcl interpreter. All widgets will be destroyed.
"Tcl 인터프리터를 종료한다. 모든 위젯이 destroy될 것이다."

quit 메서드는 인터프리터와 위젯 모두 종료한다는 걸 알 수 있습니다.

결국 quit() 실행시 destroy도 실행된다는 의미이므로,
win.destroy는 어떤 면에서는 불필요한 메서드로 보이기도 합니다.
관례상 destroy와 quit을 같이 쓰는 프로그래머들이 많은데요.
엑셀 업무자동화 코드를 예시로 들어보면 
Workbook.Close() 를 실행해서 워크북을 닫은 후에
excel.Quit()을 실행하는 것과 비슷한 맥락인 것 같습니다.
기능적으로 큰 의미를 두었다기보다는
명시적으로 destroy 후에 quit을 하는 관례를 지키는 것으로 보입니다.

마지막으로 exit 함수는 파이썬 빌트인 명령어입니다. 구동되는 파이썬 런타임을 종료하는 함수입니다.

콜백함수 정의 아래의 코드는 이전 포스팅에서 간략히 보여드린 적이 있죠.

add_cascade로 생성한 메뉴를 클릭하면 하위메뉴가 나타나게 됩니다. 필수인자로 Menu 위젯을 받아야 합니다.

add_command는 하위메뉴 중 하나의 명령을 실행합니다. 특정 콜백함수를 command의 파라미터로 받습니다.

이전 포스팅에서 윈도우메모장을 예로 들어서,
몇 가지 기능을 더 구현해볼까 했는데..
상당히 까다로운 일이어서, 메뉴바에 대한 설명은 여기서 마치도록 하겠습니다.
추후에 고급 튜토리얼에서 다룰 수 있는 기회가 있으면 좋겠습니다.

그럼 다음 포스팅에서는 메뉴바에 이어 노트북(탭)을 다루는 방법에 대해 설명드리겠습니다.

 


다음 포스팅

작성중

댓글