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
반응형
'파이썬 GUI' 카테고리의 다른 글
파이썬 GUI 파일을 독립형 실행 파일로 만드는 방법 (0) | 2024.08.10 |
---|---|
파이썬 GUI로 간단한 전자계산기 만들기 (0) | 2024.08.10 |
(파이썬 GUI) GUI에 프로그레스바 추가하기 (0) | 2024.01.08 |
(파이썬 GUI) 정보, 경고, 에러 메시지박스 생성하기 (0) | 2024.01.03 |
(파이썬 GUI) 탭 위젯 만들기 (0) | 2024.01.02 |