본문 바로가기
Python/GUI(tkinter)

독학 Python tkinter(GUI) - 18.Menubutton

by To올라운더 2023. 11. 16.
반응형

단순해보이는 메모장만 하더라도 화면뿐 아니라 상단에 메뉴바가 있다.

 

당연히 우리도 이런걸 할 수 있다.

 

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()

 

반응형