블로그 이미지
조이키트 블로그
아두이노, 라즈베리파이, 반도체 센서/모듈 활용

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

Notice

250x250
2024. 1. 2. 20:07 파이썬 GUI
728x90
반응형

여기서는 간단한 GUI를 만든 다음 이전 레시피의 위젯을 추가하고 이를 새로운 탭 레이아웃에 배치한다.

 

Tab1과 Tab2를 추가하여 만들어진 완성된 GUI의 모습이다.

 

 

전체코드

import tkinter as tk      
from tkinter import ttk  # ttk를 임포트 함
from tkinter import scrolledtext
from tkinter import Menu

win = tk.Tk()  # Tk 클래스의 인스턴스 생성
win.title("파이썬 GUI")   # 제목을 설정하기 위한 인스턴스 변수 사용
tabControl = ttk.Notebook(win)
tab1 = ttk.Frame(tabControl)
tabControl.add(tab1, text='Tab 1')
tab2 = ttk.Frame(tabControl)
tabControl.add(tab2, text='Tab 2')
tabControl.pack(expand=1, fill="both")

# tab1을 부모로 사용한 라벨프레임
mighty = ttk.LabelFrame(tab1, text=' Mighty Python ')
mighty.grid(column=0, row=0, padx=8, pady=4)

# mighty를 부모로 사용한 라벨
a_label = ttk.Label(mighty, text="Enter a name:")
a_label.grid(column=0, row=0, sticky='W')

name = tk.StringVar()  # StringVar 변수를 생성하고 tkinter의 별칭으로 tk를 사용
name_entered = ttk.Entry(mighty, width=12, textvariable=name) # ttk.Entry 위젯을 생성하고 다른 변수에 할당
name_entered.grid(column=0, row=1) # 위젯의 위치 지정
name_entered.focus()

# 다른 라벨 추가하기
ttk.Label(mighty, text="Choose a number:").grid(column=1, row=0)

number = tk.StringVar()
number_chosen = ttk.Combobox(mighty, width=12, textvariable=number)  # ttk.Combobox 위젯 생성
number_chosen['values'] = (1, 2, 4, 10, 100) # 콤보박스 위젯 값 할당
number_chosen.grid(column=1, row=1) # 콤보박스 위젯 위치 지정
number_chosen.current(0)

def click_me():  # click_me() 함수 정의 
    action.configure(text='Hello ' + name.get())
    a_label.configure(foreground='red')
    

action = ttk.Button(mighty, text="Click Me!", command=click_me) # ttkfmf 사용해 버튼을 생성하고 text 속성을 전잘 
action.grid(column=2, row=1)
action.configure(state='enable')

# 스크롤되는 텍스트 위젯
scrol_w = 50  # 높이와 넓이를 위한 변수 정의 
scrol_h = 5

# ScrolledText 위젯 생성
scr = scrolledtext.ScrolledText(mighty, width=scrol_w, height=scrol_h, wrap=tk.WORD)
scr.grid(column=0, row=5, columnspan=3) # 스크롤 위젯의 위치 지정

mighty2 = ttk.LabelFrame(tab2, text= 'The Snake ')
mighty2.grid(column=0, row=0, padx=8, pady=4)

chVarDis = tk.IntVar()
check1 = tk.Checkbutton(mighty2, text="Disabled", variable=chVarDis, state='disabled')
check1.select()  # 상태를 select로 설정
check1.grid(column=0, row=4, sticky=tk.W, padx= 20, pady=10)  # 체크박스 위치 지정

chVarUn = tk.IntVar()  
check2 = tk.Checkbutton(mighty2, text="UnChecked", variable=chVarUn)
check2.deselect()  # 상태를 deselect로 설정
check2.grid(column=1, row=4, sticky=tk.W, padx= 20, pady=10)

chVarEn = tk.IntVar()   # tk.IntVar 인스턴스 생성
check3 = tk.Checkbutton(mighty2, text="Enabled", variable=chVarEn)
check3.select()  # 상태를 select로 설정
check3.grid(column=2, row=4, sticky=tk.W, padx= 20, pady=10)

# 생상 이름을 저장하는 모듈 레벨의 전역변수 생성
COLOR1 = "Blue"
COLOR2 = "Gold"
COLOR3 = "Red"

# 라디오 버튼을 위한 콜백함수 생성
def radCall():
    radSel=radVar.get()
    if   radSel == 1: mighty2.configure(tex=COLOR1)
    elif radSel == 2: mighty2.configure(text=COLOR2)
    elif radSel == 3: mighty2.configure(text=COLOR3)

# 1개의 변수를 사용하여 3개의 라디오버튼 생성
radVar = tk.IntVar()
 
# 3개의 tk 라디오 버튼 생성
rad1 = tk.Radiobutton(mighty2, text=COLOR1, variable=radVar, value=1, command=radCall)
rad1.grid(column=0, row=6, sticky=tk.W, columnspan=3, padx= 20, pady=10)  # 그리드 레이아웃을 사용해 위치 지정

rad2 = tk.Radiobutton(mighty2, text=COLOR2, variable=radVar, value=2, command=radCall)
rad2.grid(column=1, row=6, sticky=tk.W, columnspan=3, padx= 20, pady=10)

rad3 = tk.Radiobutton(mighty2, text=COLOR3, variable=radVar, value=3, command=radCall)
rad3.grid(column=2, row=6, sticky=tk.W, columnspan=3, padx= 20, pady=10)


# 각 라벨 주변에 공간 추가하기
for child in mighty.winfo_children():
    child.grid_configure(padx=8)

for child in mighty2.winfo_children():
    child.grid_configure(padx=8)

# 메뉴바 생성하기
menu_bar = Menu(win)
win.config(menu=menu_bar)

def _quit():
    win.quit()
    win.destroy()
    exit()

# 메뉴를 생성하고 메뉴 아이템 추가하기
file_menu = Menu(menu_bar, tearoff=0)
file_menu.add_command(label="New")
file_menu.add_separator()
file_menu.add_command(label="Exit", command=_quit)
menu_bar.add_cascade(label="File", menu=file_menu)

help_menu = Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="Help", menu=help_menu)
help_menu.add_command(label="About")

#라벨 프레임
buttons_frame = ttk.LabelFrame(mighty2, text=' Labels in a Frame ')
buttons_frame.grid(column=0, row=7, padx=20, pady=40)

ttk.Label(buttons_frame, text="Label1").grid(column=0, row=0, sticky=tk.W, padx= 20, pady=10)
ttk.Label(buttons_frame, text="Label2").grid(column=1, row=0, sticky=tk.W, padx= 20, pady=10)
ttk.Label(buttons_frame, text="Label3").grid(column=2, row=0, sticky=tk.W, padx= 20, pady=10)


win.mainloop()

 

코드 설명

모듈의 최상단에 tkinter를 임포트한다.

import tkinter as tk      
from tkinter import ttk  # ttk를 임포트 함

 

Tk 클래스의 인스턴스를 생성한다.

win = tk.Tk()  # Tk 클래스의 인스턴스 생성

 

ttk 노트북을 사용해 탭컨트롤을 생성한다.

tabControl = ttk.Notebook(win)

 

탭컨트롤에 Tab1과 Tab2를 추가한다.

tab1 = ttk.Frame(tabControl)
tabControl.add(tab1, text='Tab 1')
tab2 = ttk.Frame(tabControl)
tabControl.add(tab2, text='Tab 2')

 

 

pack을 사용해 GUI 내부에 컨트롤을 가시화한다.

tabControl.pack(expand=1, fill="both")

 

라벨을 라벨프레임에 추가한다.

mighty = ttk.LabelFrame(tab1, text=' Mighty Python ')
mighty.grid(column=0, row=0, padx=8, pady=4)

 

# mighty를 부모로 사용한 라벨
a_label = ttk.Label(mighty, text="Enter a name:")
a_label.grid(column=0, row=0, sticky='W')

 

Tab1에는 위의 화면상에 Enter a name, Choose a number, Click Me!, 스크롤 위젯 기능이 들어간 부분을  mighty라는 변수를 사용해 적용시켰다. 

# mighty를 부모로 사용한 라벨
a_label = ttk.Label(mighty, text="Enter a name:")
a_label.grid(column=0, row=0, sticky='W')

name = tk.StringVar()  # StringVar 변수를 생성하고 tkinter의 별칭으로 tk를 사용
name_entered = ttk.Entry(mighty, width=12, textvariable=name) # ttk.Entry 위젯을 생성하고 다른 변수에 할당
name_entered.grid(column=0, row=1) # 위젯의 위치 지정
name_entered.focus()

# 다른 라벨 추가하기
ttk.Label(mighty, text="Choose a number:").grid(column=1, row=0)

number = tk.StringVar()
number_chosen = ttk.Combobox(mighty, width=12, textvariable=number)  # ttk.Combobox 위젯 생성
number_chosen['values'] = (1, 2, 4, 10, 100) # 콤보박스 위젯 값 할당
number_chosen.grid(column=1, row=1) # 콤보박스 위젯 위치 지정
number_chosen.current(0)

def click_me():  # click_me() 함수 정의 
    action.configure(text='Hello ' + name.get())
    a_label.configure(foreground='red')
    

action = ttk.Button(mighty, text="Click Me!", command=click_me) # ttkfmf 사용해 버튼을 생성하고 text 속성을 전잘 
action.grid(column=2, row=1)
action.configure(state='enable')

# 스크롤되는 텍스트 위젯
scrol_w = 50  # 높이와 넓이를 위한 변수 정의 
scrol_h = 5

# ScrolledText 위젯 생성
scr = scrolledtext.ScrolledText(mighty, width=scrol_w, height=scrol_h, wrap=tk.WORD)
scr.grid(column=0, row=5, columnspan=3) # 스크롤 위젯의 위치 지정

 

Tab2에는 체크박스, 라디오 버튼, Labels in a Frame  기능이 들어간 부분을 mighty2라는 변수를 사용해 적용시켰다.

mighty2 = ttk.LabelFrame(tab2, text= 'The Snake ')
mighty2.grid(column=0, row=0, padx=8, pady=4)

chVarDis = tk.IntVar()
check1 = tk.Checkbutton(mighty2, text="Disabled", variable=chVarDis, state='disabled')
check1.select()  # 상태를 select로 설정
check1.grid(column=0, row=4, sticky=tk.W, padx= 20, pady=10)  # 체크박스 위치 지정

chVarUn = tk.IntVar()  
check2 = tk.Checkbutton(mighty2, text="UnChecked", variable=chVarUn)
check2.deselect()  # 상태를 deselect로 설정
check2.grid(column=1, row=4, sticky=tk.W, padx= 20, pady=10)

chVarEn = tk.IntVar()   # tk.IntVar 인스턴스 생성
check3 = tk.Checkbutton(mighty2, text="Enabled", variable=chVarEn)
check3.select()  # 상태를 select로 설정
check3.grid(column=2, row=4, sticky=tk.W, padx= 20, pady=10)

# 생상 이름을 저장하는 모듈 레벨의 전역변수 생성
COLOR1 = "Blue"
COLOR2 = "Gold"
COLOR3 = "Red"

# 라디오 버튼을 위한 콜백함수 생성
def radCall():
    radSel=radVar.get()
    if   radSel == 1: mighty2.configure(tex=COLOR1)
    elif radSel == 2: mighty2.configure(text=COLOR2)
    elif radSel == 3: mighty2.configure(text=COLOR3)

# 1개의 변수를 사용하여 3개의 라디오버튼 생성
radVar = tk.IntVar()
 
# 3개의 tk 라디오 버튼 생성
rad1 = tk.Radiobutton(mighty2, text=COLOR1, variable=radVar, value=1, command=radCall)
rad1.grid(column=0, row=6, sticky=tk.W, columnspan=3, padx= 20, pady=10)  # 그리드 레이아웃을 사용해 위치 지정

rad2 = tk.Radiobutton(mighty2, text=COLOR2, variable=radVar, value=2, command=radCall)
rad2.grid(column=1, row=6, sticky=tk.W, columnspan=3, padx= 20, pady=10)

rad3 = tk.Radiobutton(mighty2, text=COLOR3, variable=radVar, value=3, command=radCall)
rad3.grid(column=2, row=6, sticky=tk.W, columnspan=3, padx= 20, pady=10)

#라벨 프레임
buttons_frame = ttk.LabelFrame(mighty2, text=' Labels in a Frame ')
buttons_frame.grid(column=0, row=7, padx=20, pady=40)

ttk.Label(buttons_frame, text="Label1").grid(column=0, row=0, sticky=tk.W, padx= 20, pady=10)
ttk.Label(buttons_frame, text="Label2").grid(column=1, row=0, sticky=tk.W, padx= 20, pady=10)
ttk.Label(buttons_frame, text="Label3").grid(column=2, row=0, sticky=tk.W, padx= 20, pady=10)

 

위의 코드들을 보면 각 부분들의 구체적인 설명은 하지 않았다. 다만 Tab1과 Tab2를 mighty와 mighty2라는 변수로 부모 컨테이너를 지정해 일부 기능들을 분류하여 적용하는데 중점적으로 설명하였다.

728x90
반응형
posted by 조이키트 블로그