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

24. 상단에 메뉴바 붙이기

by 일코 2022. 11. 20.

지난 포스팅

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

 

23. 프레임 안의 위젯들 속성을 일괄변경하기

지난 포스팅 2022.11.20 - [기타/tkinter 한꼬집씩만 따라해보기] - 22. 프레임 위젯 - 위젯들을 묶어주는 위젯 22. 프레임 위젯 - 위젯들을 묶어주는 위젯 지난 포스팅 2022.11.18 - [기타/tkinter 한꼬집씩만

martinii.fun


 

이번 포스팅에서는 : GUI상단에 메뉴바 붙이기

이번에는 GUI레이아웃에서 굉장히 중요한 파트인 "메뉴바" 만들기입니다.

메뉴바를 만들고 각 메뉴버튼에 커맨드를 붙이기 시작하면

GUI의 코드가 대체로 길어지기 때문에 어느 정도 레이아웃이나 트리구조를 정리해둔 후 작업하시기를 권합니다.

코드를 먼저 보여드리기 전에 메뉴바를 구성하는 순서에 대해서 간략히 설명드리겠습니다.

이해하기보다는 암기하는 느낌으로 읽어보시고, 사용해보시면서 익숙해지시기를 바랍니다.

(지금까지 위젯을 만들고 추가하는 단순한 과정과 비교하면, 아주 조금 더 복잡합니다.)

메뉴바를 만드는 기본적인 순서는 다음과 같습니다.

1. 메뉴바 = tk.Menu로 최상위 메뉴바 위젯을 생성
2. win.config(menu=메뉴바) 로 메뉴바를 붙임 (아무 것도 바뀌지 않음)
3. 파일 = tk.Menu(master=메뉴바) 로 파일메뉴 위젯을 생성 (아직 아무 것도 바뀌지 않음)
4. 메뉴바.add_cascade(menu=파일, label="파일(F)") 로 파일 메뉴버튼을 생성 ("파일" 메뉴가 GUI에 보임)
5. 파일.add_command(command=커맨드, label="새로 만들기(N)") 로 파일메뉴의 하위메뉴 "새로 만들기"를 생성
6.추가로  add_cascade나, add_command 또는 add_separator 등을 수행하여 전체메뉴를 완성

이번 예제에서 따라해볼 메뉴는 지난 포스팅에서도 사용했던 윈도우메모장입니다.

완성된 tkinter GUI를 먼저 보여드리고, 코드를 마지막에 보여드리겠습니다.

tkinter 메뉴도 제법 그럴싸하죠?

아래는 코드입니다.

코드가 다소 길지만, 메뉴버튼이 많아서 그렇지
하나하나씩만 잘라서 보시면 굉장히 간결한 문법에 깜짝 놀라실 겁니다ㅎ
import tkinter as tk
from tkinter.scrolledtext import ScrolledText  # 메모장 텍스트영역 생성 위함

filename = ""  # 파일을 열면 제목줄에 파일명 표시하기 위함

def 더미_콜백():  # 콜백함수까지 만들 시간에 포스팅을 하나 더...ㅜ
    pass


win = tk.Tk()
win.geometry("690x420")  # 시작사이즈 고정
win.title(f"{[filename if filename else '제목 없음'][0]} - tkinter 메모장")  # 파일이름 표시
상태표시줄여부 = tk.IntVar()  # 상태표시줄 체크버튼용
상태표시줄여부.set(1)

메뉴바 = tk.Menu(win)
win.config(menu=메뉴바)  # 메뉴바 객체를 win 메뉴로 지정

파일 = tk.Menu(메뉴바, tearoff=False)  # 메뉴바의 메뉴버튼으로 들어갈 위젯들 생성
편집 = tk.Menu(메뉴바, tearoff=False)  # tearoff는 꼭 False로 지정할 것.
서식 = tk.Menu(메뉴바, tearoff=False)  # tearoff가 True(기본값)이면 메뉴를 떼어낼 수 있음..
보기 = tk.Menu(메뉴바, tearoff=False)
확대축소 = tk.Menu(보기, tearoff=False)
도움말 = tk.Menu(메뉴바, tearoff=False)

메뉴바.add_cascade(label="파일(F)", menu=파일)  # 생성된 메뉴들을 메뉴바에 (실제로) 붙이기
메뉴바.add_cascade(label="편집(E)", menu=편집)
메뉴바.add_cascade(label="서식(O)", menu=서식)
메뉴바.add_cascade(label="보기(V)", menu=보기)
메뉴바.add_cascade(label="도움말(H)", menu=도움말)

파일.add_command(label="새로 만들기(N)", command=더미_콜백)  # 각 메뉴의 하위커맨드 지정
파일.add_command(label="새 창(W)", command=더미_콜백)
파일.add_command(label="열기(O)", command=더미_콜백)
파일.add_command(label="저장(S)", command=더미_콜백)
파일.add_command(label="다른 이름으로 저장(A)", command=더미_콜백)
파일.add_separator()  # 구분자
파일.add_command(label="페이지 설정(U)", command=더미_콜백)
파일.add_command(label="인쇄(P)", command=더미_콜백)
파일.add_separator()  # 구분자
파일.add_command(label="끝내기(X)", command=더미_콜백)

편집.add_command(label="실행 취소(U)", command=더미_콜백)
편집.add_separator()  # 구분자
편집.add_command(label="잘라내기(T)", command=더미_콜백)
편집.add_command(label="복사(C)", command=더미_콜백)
편집.add_command(label="붙여넣기(P)", command=더미_콜백)
편집.add_command(label="삭제(L)", command=더미_콜백)
편집.add_separator()  # 구분자
편집.add_command(label="Bing으로 검색(S)", command=더미_콜백)
편집.add_command(label="찾기(F)", command=더미_콜백)
편집.add_command(label="다음 찾기(N)", command=더미_콜백)
편집.add_command(label="이전 찾기(V)", command=더미_콜백)
편집.add_command(label="바꾸기(R)", command=더미_콜백)
편집.add_command(label="이동(G)", command=더미_콜백)
편집.add_separator()  # 구분자
편집.add_command(label="모두 선택(A)", command=더미_콜백)
편집.add_command(label="시간/날짜(D)", command=더미_콜백)

서식.add_command(label="자동 줄 바꿈(W)", command=더미_콜백)
서식.add_command(label="글꼴(F)", command=더미_콜백)

보기.add_cascade(label="확대하기/축소하기", menu=확대축소)  # 하위메뉴 있음
보기.add_checkbutton(label="상태 표시줄(S)", variable=상태표시줄여부)

확대축소.add_command(label="확대(I)", command=더미_콜백)
확대축소.add_command(label="축소(O)", command=더미_콜백)
확대축소.add_command(label="확대하기/축소하기 기본값 복원", command=더미_콜백)

도움말.add_command(label="도움말 보기(H)", command=더미_콜백)
도움말.add_command(label="피드백 보내기(F)", command=더미_콜백)
도움말.add_separator()  # 구분자
도움말.add_command(label="메모장 정보(A)", command=더미_콜백)

text = ScrolledText(win, font=("D2Coding Ligature", 50, "bold"))  # 텍스트위젯 기본폰트 설정
text.grid()  # row, column 입력하지 않았을 때 기본값은 row=0, column=0
text.insert(chars="Hello World", index="1.0")  # 텍스트위젯에 "Hello World" 삽입

win.mainloop()

위에 구동되는 움짤과 코드를 대조하면서 코드를 읽어보시면

메뉴바 생성방법에 대해 쉽게 이해하실 겁니다.

부록 : pygubu designer로 메뉴 생성하기

메뉴바를 생성할 때, 이처럼 직접 코딩으로 짜는 방법도 있지만

pygubu designer 같은 위지윅 툴을 사용하면 굉장히 간편히 메뉴바를 포함한 GUI를 생성할 수 있습니다.

특히 메서드나 속성이 궁금한 경우, 디자이너로 GUI를 먼저 생성하고 나서, 만들어진 코드를 참고할 수도 있고요.

pygubu designer로 메뉴바를 만드는 과정 일부를 짧게 한 번 보여드리겠습니다.

1. 아래처럼 틀을 만들고 나서

2. 아래처럼 레이블과 속성을 수정할 수 있습니다.

3. 메뉴작업을 마쳤으면, Code탭의 Code Script를 선택하고, 하단의 Generate를 클릭해보면 파이썬 코드가 나옵니다.

클래스 문법으로 일련의 프로그램이 완성되어 있는데요.

코드 전체를 활용하셔도 되지만, 

이 중 필요한 부분만 복사해서 인스턴스명 등 일부만 수정한 후 여러분의 메인코드에 활용하시면 됩니다.

아래처럼요.

짜잔! 순식간에 메뉴바 코드를 완성했습니다.

pygubu-designer에 대해서도 추후에 상세히 다루도록 하겠습니다. (유튜브에도 멋진 튜토리얼이 많이 있습니다.)

아무래도 튜토리얼 후반으로 갈수록 코딩보다는 디자이너를 활용하는 방법을 많이 알려드리고 싶네요.

그게 훨씬 효율적이기도 하니까요. 다만, 기본적인 코드를 이해한 후 디자이너를 쓰시면

훨씬 더 유연하게 디자이너와 코드를 병행해서 활용하실 수 있게 될 겁니다.

이번 포스팅은 여기서 마칩니다.

 


다음 포스팅

2022.11.20 - [기타/tkinter 한꼬집씩만 따라해보기] - 25. 메뉴바의 종료버튼으로 프로그램 종료하기

 

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

지난 포스팅 2022.11.20 - [기타/tkinter 한꼬집씩만 따라해보기] - 24. 상단에 메뉴바 붙이기 24. 상단에 메뉴바 붙이기 지난 포스팅 2022.11.20 - [기타/tkinter 한꼬집씩만 따라해보기] - 23. 프레임 안의 위

martinii.fun

 

댓글