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

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 31

Notice

250x250
2024. 1. 15. 18:40 파이썬 GUI
728x90
반응형

여기서는 tkinter 캔버스 위젯을 사용해 GUI에 극적인 색상 효과를 추가하는 방법을 보여준다.

 

먼저 GUI에 새로운 탭 tab3을 만든다.

tab3 = ttk.Frame(tabControl)
tabControl.add(tab3, text='Tab 3') # 세번째 탭 추가하기
tabControl.pack(expand=1, fill="both")  # 탭을 나타내기 위 패킹하기

 

다음으로 tkinter의 또 다른 내장 위젯 Canvas를 호출한다.

# Tab Control 3
tab3_frame = tk.Frame(tab3, bg='blue')
tab3_frame.pack()
for orange_color in range(2):
    canvas = tk.Canvas(tab3_frame, width=150, height=80, highlightthickness=0, bg='orange')
    canvas.grid(row=orange_color, column=orange_color)

 

코드 설명

새탭을 만든 후에는 일반 tk.Frame을 배치하고 배경색을 파란색으로 지정한다. 

루프에서 두 개의 tk.Canvas 위젯을 만들어 그리드 좌표 0, 0과  1, 1에 오랜지색을 할당한다.  또한 두 개의 다른 격자 위치에서 tk.Frame의 파란색 배경색을 볼 수 있다. 

 

전체 코드

import tkinter as tk      
from tkinter import ttk  # ttk를 임포트 함
from tkinter import scrolledtext
from tkinter import Menu
from tkinter import messagebox as msg
from tkinter import Spinbox
from tkinter import SCROLL
from time import sleep


win = tk.Tk()  # Tk 클래스의 인스턴스 생성
win.title("파이썬 GUI")   # 제목을 설정하기 위한 인스턴스 변수 사용
win.iconbitmap('pyc.ico')
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")

tab3 = ttk.Frame(tabControl)
tabControl.add(tab3, text='Tab 3') # 세번째 탭 추가하기
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')

# Spinbox 콜백
def _spin():
    value = spin.get()
    print(value)
#    scrol.insert(tk.INSERT, value + 'n')

# Spinbox2 콜백
def _spin2():
    value = spin2.get()
    print(value)
 #   scrol.insert(tk.INSERT, value + '\n')

# Spinbox 위젯 추가하기
spin = Spinbox(mighty, from_=0, to=10, width=10, bd=8, command=_spin)
spin.grid(column=0, row=2)
spin2 = Spinbox(mighty, values=('0 50 100'), width=10, bd=8, command=_spin2, relief=tk.RIDGE)
spin2.grid(column=1, row=2)
spin3 = Spinbox(mighty, values=('0 50 100'), width=10, bd=8, command=_spin2, relief=tk.FLAT)
spin3.grid(column=2, row=2)


# 스크롤되는 텍스트 위젯
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, sticky='WE', 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 라디오 버튼 생성
for col in range(3):
    curRad = tk.Radiobutton(mighty2, variable=radVar, value=col, command=radCall)
    curRad.grid(column=col, row=6, sticky=tk.W)

# Tab2에 프로그레스바 추가
    progress_bar = ttk.Progressbar(tab2, orient='horizontal', length=286, mode='determinate')
    progress_bar.grid(column=0, row=3, pady=2)

# 콜백 함수에서 상태바 업데이트 하기
def run_progressbar():
    progress_bar["maximum"] = 100
    for i in range(101):
        sleep(0.05)
        progress_bar["value"] = i # 프로그레스바 증가시키기
        progress_bar.update()     # 순환문에서 update() 호출
        progress_bar["value"] = 0 # 프로그레스바 리셋 및 정리

# start 프로그레스바
def start_progressbar():
    progress_bar.start()

# stop 프로그레스바
def stop_progressbar():
    progress_bar.stop()

# 0.1초 후 프로그레스바 stop 
def progressbar_stop_after(wait_ms=1000):
    win.after(wait_ms, progress_bar.stop)

# 프로그레스바를 담기 위한 컨테이너 생성
buttons_frame = ttk.LabelFrame(mighty2, text=' ProgressBar ')
buttons_frame.grid(column=0, row=7, sticky='W', columnspan=2, padx=20, pady=40)

# Progressbar 명령 버튼을 추가
ttk.Button(buttons_frame, text=" Run Progressbar ", command=run_progressbar).grid(column=0, row=0, sticky='W')
ttk.Button(buttons_frame, text=" Start Progressbar ", command=start_progressbar).grid(column=0, row=1, sticky='W')
ttk.Button(buttons_frame, text=" Stop immediately ", command=stop_progressbar).grid(column=0, row=2, sticky='W')
ttk.Button(buttons_frame, text=" Stop after second ", command=progressbar_stop_after).grid(column=0, row=3, sticky='W')

# 순환문에 buttons_frame의 자식인 추가적인 패딩 추가
for child in buttons_frame.winfo_children():
    child.grid_configure(padx=2, pady=2)

# Tab2의 자식으로 추가적인 패딩 추가
for child in mighty2.winfo_children():
    child.grid_configure(padx=8, pady=2)


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

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

# Tab Control 3
tab3_frame = tk.Frame(tab3, bg='blue')
tab3_frame.pack()
for orange_color in range(2):
    canvas = tk.Canvas(tab3_frame, width=150, height=80, highlightthickness=0, bg='orange')
    canvas.grid(row=orange_color, column=orange_color)

# 메뉴바 생성하기
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)

def _msgBox():
    msg.showinfo('Python Message Info Box', 'A Python GUI created using tkinter' 'This year is 2024.')
    msg.showwarning('Python Message Warning Box', 'A Python GUI created using tkinter' '\nWarning: There might be a bug in this code.')
    msg.showerror('Python Message Error Box', 'A Python GUI created using tkinter:' '\nError : Houston ~ we Do have a serious PROBLEM!')
    answer = msg.askyesnocancel("Python Message Multi Choice Box", "Are you sure you really wish to do this?")


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


win.mainloop()

 

 

 

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