단순해보이는 메모장만 하더라도 화면뿐 아니라 상단에 메뉴바가 있다.
당연히 우리도 이런걸 할 수 있다.
button과 유사한 방법으로 메뉴항목을 만들고,
해당 항목을 선택할 때 특정 기능을 실행할 수 있다.
1. 최상단 메뉴 항목 만들기
- 일단 메모장과 같은 메뉴 항목을 만들고, 실행할 comman는 print문으로 단순히 확인만 진행해보겠다.
from tkinter import *
root = Tk()
root.title('To올라운드의 알찬 GUI 강의')
root.geometry("300x500") # 가로 X 세로 / 대문자X 하면 실행안됨
#msb.showinfo('Welcome','안녕하세요. To올라운더와 함께 하는 GUI입니다.')
body_frame = Frame(root, relief='solid', bd=2, background='orange', padx=5, pady=5)
body_frame.pack(fill='both', expand=True)
quit_btn = Button(body_frame, text='종료', command=quit)
quit_btn.pack(fill='x')
menu_bar = Menu(root) # 메뉴바
# 파일(F) 메뉴
menu_file = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="파일(F)", menu=menu_file) # 해당 항목 누락시 나타나지 않음. 다른 위젯 pack과 같은 기능
# 편집(E) 메뉴
# 서식(O) 메뉴
# 보기(V) 메뉴
# 도움말(H) 메뉴
root.config(menu=menu_bar) # 해당 코드가 있어야 GUI상에 메뉴바가 나타남
root.resizable(False,False) # x너비, y 변경 허용 여부
root.mainloop()
- 19라인 : menu_bar라는 변수로 Menu 위젯을 생성한다. 다른 위젯들의 경우, pack이나 grid 등의 매서드로 GUI상에 나타나게 해주었듯이, 33라인에 있는 config 항목과 22~23 라인과 같이 1개 이상의 menu 항목이 있어야 GUI 상에 표기된다.
- 22라인: menu_file 이라는 변수명으로 menu_bar에 추가할 menu 위젯을 생성한다. tearoff 는 menu 항목의 분리선을 나타내는데, 일반적으로 False(0)을 사용한다. 좌측이 tearoff = 0 / 우측이 tearoff = 1 인 상태이다.
- 나머지 편집 ~ 보기 메뉴까지 추가한 코드는 아래와 같다.
from tkinter import *
root = Tk()
root.title('To올라운드의 알찬 GUI 강의')
root.geometry("300x500") # 가로 X 세로 / 대문자X 하면 실행안됨
#msb.showinfo('Welcome','안녕하세요. To올라운더와 함께 하는 GUI입니다.')
body_frame = Frame(root, relief='solid', bd=2, background='orange', padx=5, pady=5)
body_frame.pack(fill='both', expand=True)
quit_btn = Button(body_frame, text='종료', command=quit)
quit_btn.pack(fill='x')
menu_bar = Menu(root) # 메뉴바
# 파일(F) 메뉴
menu_file = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="파일(F)", menu=menu_file) # 해당 항목 누락시 나타나지 않음. 다른 위젯 pack과 같은 기능
# 편집(E) 메뉴
menu_edit = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="편집(E)", menu=menu_edit)
# 서식(O) 메뉴
menu_format = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="서식(O)", menu=menu_format)
# 보기(V) 메뉴
menu_view = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="보기(V)", menu=menu_view)
# 도움말(H) 메뉴
menu_help = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="도움말(H)", menu=menu_help)
root.config(menu=menu_bar) # 해당 코드가 있어야 GUI상에 메뉴바가 나타남
root.resizable(False,False) # x너비, y 변경 허용 여부
root.mainloop()
- 메뉴 항목은 정상적으로 생겼지만, 아직 하위 메뉴가 없어 눌러도 아무런 반응이 없다.
2. 하위 항목 추가하기(+구분선)
- 하위 항목을 넣는 방법은 어렵지 않다.
from tkinter import *
root = Tk()
root.title('To올라운드의 알찬 GUI 강의')
root.geometry("300x500") # 가로 X 세로 / 대문자X 하면 실행안됨
#msb.showinfo('Welcome','안녕하세요. To올라운더와 함께 하는 GUI입니다.')
body_frame = Frame(root, relief='solid', bd=2, background='orange', padx=5, pady=5)
body_frame.pack(fill='both', expand=True)
quit_btn = Button(body_frame, text='종료', command=quit)
quit_btn.pack(fill='x')
menu_bar = Menu(root) # 메뉴바
# 파일(F) 메뉴
menu_file = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="파일(F)", menu=menu_file) # 해당 항목 누락시 나타나지 않음. 다른 위젯 pack과 같은 기능
menu_file.add_command(label="새로 만들기(N)")
menu_file.add_command(label="새 창(W)")
menu_file.add_command(label="열기(O)")
menu_file.add_command(label="저장(S)")
menu_file.add_command(label="다른 이름으로 저장(A)")
menu_file.add_separator()
menu_file.add_command(label="페이지 설정(U)")
menu_file.add_command(label="인쇄(P)", state = "disable") # 비활성화
menu_file.add_separator()
menu_file.add_command(label="끝내기(X)", command = root.quit) # 비활성화
# 편집(E) 메뉴
menu_edit = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="편집(E)", menu=menu_edit)
# 서식(O) 메뉴
menu_format = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="서식(O)", menu=menu_format)
# 보기(V) 메뉴
menu_view = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="보기(V)", menu=menu_view)
# 도움말(H) 메뉴
menu_help = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="도움말(H)", menu=menu_help)
root.config(menu=menu_bar) # 해당 코드가 있어야 GUI상에 메뉴바가 나타남
root.resizable(False,False) # x너비, y 변경 허용 여부
root.mainloop()
- 앞선 포스팅에서 pack 매서드를 통해 추가하듯이, add_command 매서드를 이용해 항목을 추가할 수 있다.
- button 처럼 command 를 넣으면 해당 매서드를 실행할 수도 있는데, 아래의 lambda 함수는 한줄로 간단히 줄여 쓰는 형태이거나 파라미터를 전달 받아야할 때 주로 사용한다. 해당 버튼을 눌러보면 터미널에 '새로 만들기' 라는 텍스트가 출력되는 것을 확인할 수 있다.
( *lambda에 대한 더 자세한 포스팅은 다음에 준비해보도록 하겠습니다.)
- 그 외에도 sparator를 통해 구분자를 만들 수도 있고, state 상태를 통해 비활성화 상태를 만들 수도 있다.
3. checkbutton, radiobutton
1) checkbutton
- GUI에서 적용하는 checkbutton과 동일하게 변수를 먼저 지정해주고(48라인)
해당 변수를 variable 파라미터로 지정해주면 된다.(52라인)
- 해당 변수를 .get() 매서드를 통해 결과를 확인해보면 선택 유무에 따라, 0과 1로 결과 값을 확인할 수 있다.
from tkinter import *
root = Tk()
root.title('To올라운드의 알찬 GUI 강의')
root.geometry("300x500") # 가로 X 세로 / 대문자X 하면 실행안됨
#msb.showinfo('Welcome','안녕하세요. To올라운더와 함께 하는 GUI입니다.')
body_frame = Frame(root, relief='solid', bd=2, background='orange', padx=5, pady=5)
body_frame.pack(fill='both', expand=True)
menu_auto_line_change_value_btn = Button(body_frame, text='자동 줄 바뀜 상태 보기', command= lambda : print(auto_line_change_value.get()))
menu_auto_line_change_value_btn.pack(fill='x')
quit_btn = Button(body_frame, text='종료', command=quit)
quit_btn.pack(fill='x')
menu_bar = Menu(root) # 메뉴바
# 파일(F) 메뉴
menu_file = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="파일(F)", menu=menu_file) # 해당 항목 누락시 나타나지 않음. 다른 위젯 pack과 같은 기능
menu_file.add_command(label="새로 만들기(N)", command= lambda: print('새로만들기'))
menu_file.add_command(label="새 창(W)")
menu_file.add_command(label="열기(O)")
menu_file.add_command(label="저장(S)")
menu_file.add_command(label="다른 이름으로 저장(A)")
menu_file.add_separator()
menu_file.add_command(label="페이지 설정(U)")
menu_file.add_command(label="인쇄(P)", state = "disable") # 비활성화
menu_file.add_separator()
menu_file.add_command(label="끝내기(X)", command = root.quit) # 비활성화
# 편집(E) 메뉴
menu_edit = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="편집(E)", menu=menu_edit)
# 서식(O) 메뉴
auto_line_change_value = IntVar()
menu_format = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="서식(O)", menu=menu_format)
menu_format.add_checkbutton(label='자동 줄 바꿈(W)', variable=auto_line_change_value)
# 보기(V) 메뉴
menu_view = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="보기(V)", menu=menu_view)
# 도움말(H) 메뉴
menu_help = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="도움말(H)", menu=menu_help)
root.config(menu=menu_bar) # 해당 코드가 있어야 GUI상에 메뉴바가 나타남
root.resizable(False,False) # x너비, y 변경 허용 여부
root.mainloop()
2) radiobutton
- 기존의 radiobutton의 사용법과 동일하다.
- 변수를 선언하고(58라인), radiobutton의 value 값과 선택된 값을 55라인에 선언한 변수에 적용한다.(63~65라인)
- 기본 값을 설정하기 위해 해당 변수명.set(value=?)에 해당 값을 설정한다.(67라인)
- 입력된 값을 확인하기 위해서는 변수명.get()을 통해 확인 가능하다.(18라인)
from tkinter import *
root = Tk()
root.title('To올라운드의 알찬 GUI 강의')
root.geometry("300x500") # 가로 X 세로 / 대문자X 하면 실행안됨
#msb.showinfo('Welcome','안녕하세요. To올라운더와 함께 하는 GUI입니다.')
body_frame = Frame(root, relief='solid', bd=2, background='orange', padx=5, pady=5)
body_frame.pack(fill='both', expand=True)
menu_auto_line_change_value_btn = Button(body_frame, text='자동 줄 바뀜 상태 보기', command= lambda : print(auto_line_change_value.get()))
menu_auto_line_change_value_btn.pack(fill='x')
menu_view_mode_value_btn = Button(body_frame, text='보기 상태 보기', command= lambda : print(view_mode_value.get()))
menu_view_mode_value_btn.pack(fill='x')
quit_btn = Button(body_frame, text='종료', command=quit)
quit_btn.pack(fill='x')
menu_bar = Menu(root) # 메뉴바
# 파일(F) 메뉴
menu_file = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="파일(F)", menu=menu_file) # 해당 항목 누락시 나타나지 않음. 다른 위젯 pack과 같은 기능
menu_file.add_command(label="새로 만들기(N)", command= lambda: print('새로만들기'))
menu_file.add_command(label="새 창(W)")
menu_file.add_command(label="열기(O)")
menu_file.add_command(label="저장(S)")
menu_file.add_command(label="다른 이름으로 저장(A)")
menu_file.add_separator()
menu_file.add_command(label="페이지 설정(U)")
menu_file.add_command(label="인쇄(P)", state = "disable") # 비활성화
menu_file.add_separator()
menu_file.add_command(label="끝내기(X)", command = root.quit) # 비활성화
# 편집(E) 메뉴
menu_edit = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="편집(E)", menu=menu_edit)
# 서식(O) 메뉴
auto_line_change_value = IntVar()
menu_format = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="서식(O)", menu=menu_format)
menu_format.add_checkbutton(label='자동 줄 바꿈(W)', variable=auto_line_change_value)
# 보기(V) 메뉴
view_mode_value = IntVar()
menu_view = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="보기(V)", menu=menu_view)
menu_view.add_radiobutton(label='최대화 보기', value=1, variable=view_mode_value)
menu_view.add_radiobutton(label='최소화 보기', value=2, variable=view_mode_value)
menu_view.add_radiobutton(label='이전 크기 보기', value=3, variable=view_mode_value)
view_mode_value.set(value=1)
# 도움말(H) 메뉴
menu_help = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="도움말(H)", menu=menu_help)
root.config(menu=menu_bar) # 해당 코드가 있어야 GUI상에 메뉴바가 나타남
root.resizable(False,False) # x너비, y 변경 허용 여부
root.mainloop()
'Python > GUI(tkinter)' 카테고리의 다른 글
독학 Python tkinter(GUI) - 20. py to exe 로 변환하기 (2) | 2023.11.30 |
---|---|
독학 Python tkinter(GUI) - 19.Last piece1(thread) (0) | 2023.11.22 |
독학 Python tkinter(GUI) - 17.progressbar (0) | 2023.11.15 |
독학 Python tkinter(GUI) - 16.photoimage(+PIL) (0) | 2023.11.14 |
독학 Python tkinter(GUI) - 15.Combobox (0) | 2023.11.13 |