IT 공부/python

[ python ] Tkinter project

JONGI-N CHOI 2020. 12. 11. 15:23

Tkinter는 Tcl/Tk에 대한 파이썬 Wrapper로서 Tcl/Tk를 파이썬에 사용할 수 있도록 한 Lightweight GUI 모듈이다. Tcl은 Tool Command Language의 약자로서 일종의 프로그래밍 언어이며, Tk는 크로스 플랫폼에 사용되는 일종의 GUI 툴킷이다. Tkinter는 타 GUI 프레임워크나 툴킷에 비해 지원되는 위젯들이 부족하고 UI도 그렇게 예쁘지 않다는 단점이 있지만, Python 설치시 기본적으로 내장되어 있는 파이썬 표준 라이브러리이기 때문에 쉽고 간단한 GUI 프로그램을 만들 때 활용될 수 있다.
여기서는 Python 3.4에 있는 Tkinter를 사용하며, Tkinter의 기본적인 개념 및 기초 사용법 만을 소개한다.

사진 출처 :http://pythonstudy.xyz/python/article/121-Tkinter-%EC%9C%84%EC%A0%AF


create_frame

from tkinter import *

root = Tk()
root.title("Jong GUI")  # 타이틀명 지정
root.geometry("640x480")  # 가로 x 세로의 크기 지정
# root.geometry("640x480+300+100")  # 가로 x 세로 크기  + x좌표 + y좌표
root.resizable(False, False)  # x(너비), y(높이) 값 변경 불가 ( 창크기 변경 불가)

root.mainloop()  # 창이 닫히지 않게 해주는 것

tkinter를 이용해서 GUI를 만들기 위해서는 root = Tk()와  root.mainloop()를 양끝에 적어줘야한다. 

 

root.title(title)

말 그대로 타이틀의 명을 지정한다.

root.geometry()

root.geometry("가로x세로") 가로 세로의 크기를 지정

root.geometry("가로x세로+x좌표+y좌표") GUI의 창이 켜지는 좌표를 지정해주는 것 모니터의 왼쪽 위 맨 끝이 0,0 을 기준  

 

resizable()

resizable(x값 변경 , y값 변경) 

True는 너비 or 높이가 변경 가능하게 만들어주는 

False는 너비 or 높이가 변경 불가능하게 만들어준다. 


button 위젯

from tkinter import *

root = Tk()
root.title("Jong GUI")  # 타이틀명 지정

btn1 = Button(root, text="버튼1")  # root는 메인을 의미한다.
btn1.pack()  # pack을 해줘야 실제로 적용이 된다.

btn2 = Button(root, padx=5, pady=10, text="버튼2")  # padx 는 x공간에 padding을 주는
btn2.pack()

btn3 = Button(root, padx=10, pady=5, text="버튼3")
btn3.pack()

btn4 = Button(root, width=10, height=3, text="버튼4")  # 버튼의 크기를 고정시키는
btn4.pack()
# btn4번은 글자가 많아지면 글자가 짤림, btn2,3번은 같이 커진다.

btn5 = Button(root, fg="red", bg="yellow", text="버튼5")
btn5.pack()

photo = PhotoImage(file="D:\\python\\project\\tkinter\\image.png")
btn6 = Button(root, image=photo)
btn6.pack()


def btncmd():
    print("버튼이 클릭 되었어요")


btn7 = Button(root, text="동작 하는 버튼", command=btncmd)
btn7.pack()


root.mainloop()  # 창이 닫히지 않게 해주는 것

Button()

 

btn1 = Button(root, text="버튼1")  # root는 메인을 의미한다.
btn1.pack()  # pack을 해줘야 실제로 적용이 된다.

root는 GUI main 화면을 가르킨다. 

text는 버튼의 이름을 정할 수 있다. 

Pack 위젯들을 부모 위젯에 모두 패킹하여 불필요한 공간을 없앤다. 위젯.pack() 메서드를 사용

 

 

btn2 = Button(root, padx=5, pady=10, text="버튼2")  # padx 는 x공간에 padding을 주는
btn2.pack()

padx, pady 버튼의 크기를 padding을 줄 수 있다.

.

 

 

padding이기 때문에 글자수가 늘어나면 버튼도 같이 늘어난다. 

 

btn4 = Button(root, width=10, height=3, text="버튼4")  # 버튼의 크기를 고정시키는
btn4.pack()

width, height 버튼의 크기를 절대크기로 지정할 수 있다

 

절대크기이기 때문에 글자수가 늘어나면 글자가 짤리게 나온다.

 

 

btn5 = Button(root, fg="red", bg="yellow", text="버튼5")
btn5.pack()

fg, 글자색

bg, 버튼 배경색

 

image 불러오기 

PhotoImage를 이용하여 위젯들의 공간에 이미지를 불러올 수 있다. 

PhotoImage(file ="경로") 기본 경로는 현재 프로젝트의 위치가 된다. 

 

Button에 이미지를 적용하기

Button(root, image=photo) Button에 text가 아닌 image에 PhotoImage로 불러온 값을 넣어준다. 

photo = PhotoImage(file="D:\\python\\project\\tkinter\\image.png")
btn6 = Button(root, image=photo)
btn6.pack()

이미지버튼

 

 

 

 

Button에 이벤트 주기 

def btncmd():
    print("버튼이 클릭 되었어요")


btn7 = Button(root, text="동작 하는 버튼", command=btncmd)
btn7.pack()

Button의 속성안에 command를 이용해서 동작하고 싶은 함수를 연결한다. 

btncmd라는 함수는 "버튼이 클릭 되었어요"라는 문구를 출력해주는 함수이다. 

 

Button이 눌리면 command에 있는 btncmd함수가 실행되게 된다

 


label 위젯

from tkinter import *

root = Tk()
root.title("Jong GUI")  # 타이틀명 지정
root.geometry("640x480")

label1 = Label(root, text="안녕하세요")
label1.pack()

photo = PhotoImage(file="D:\\python\\project\\tkinter\\image.png")
label2 = Label(root, image=photo)
label2.pack()


def change():
    label1.config(text="또 만나요")  # config 속성 값을 바꿔주고 싶을 때

    global photo2  # Garbage Collection : 불필요한 메모리 공간 해제
    # 전역변수로 만들어야 불필요한 메모리라고 인식이 안되기 때문에
    # 전역변수가 아니면 필요없는 것인지 알고 메모리 삭제해버림
    photo2 = PhotoImage(file="D:\\python\\project\\tkinter\\image2.png")
    label2.config(image=photo2)


btn = Button(root, text="클림", command=change)
btn.pack()


root.mainloop()  # 창이 닫히지 않게 해주는 것

label은 텍스트 혹은 이미지를 보여주는 위젯

 

텍스트

label1 = Label(root, text="안녕하세요")
label1.pack()

 

텍스트를 넣을 수 있다.

 

이미지

photo = PhotoImage(file="D:\\python\\project\\tkinter\\image.png")
label2 = Label(root, image=photo)
label2.pack()

 

이미지도 넣을 수 있다.

 

button을 이용해서 label의 내용을 변경하는 것도 가능

def change():
    label1.config(text="또 만나요")  # config 속성 값을 바꿔주고 싶을 때

    global photo2  # Garbage Collection : 불필요한 메모리 공간 해제
    # 전역변수로 만들어야 불필요한 메모리라고 인식이 안되기 때문에
    # 전역변수가 아니면 필요없는 것인지 알고 메모리 삭제해버림
    photo2 = PhotoImage(file="D:\\python\\project\\tkinter\\image2.png")
    label2.config(image=photo2)


btn = Button(root, text="클림", command=change)
btn.pack()

change()라는 함수를 만들어서 

label.config(text="txt"),  config를 사용하면 label의 속성값을 바꿀 수 있다. 

 

위에 코드에서 주의할 점은,

photo를 변경할려고 할 경우에 photo2라는 변수의 위치가 함수안에 있기 때문에 전역변수가 아니다 

그러면 garbage collection 이라는 불필요한 메모리 공간을 해제하는 역할을 하는 친구가 이 photo2를 먹어버려서 

동작을 안하게 된다. 

 

그렇기 때문에, 전역변수로 만들기 위해 앞에 global photo2라는 것을 추가해주면  정상적으로 동작을 함

 

변경전

 

 

 

 

변경후

 


text_entry 위젯

from tkinter import *

root = Tk()
root.title("Jong GUI")  # 타이틀명 지정
root.geometry("640x480")  # 가로 x 세로의 크기 지정

txt = Text(root, width=30, height=5)
txt.pack()

txt.insert(END, "글자를 입력하세요")  # 디폴트 txt값을 입력
# END입력될 위치를 선택 지금은 아무것도 없으니 처음부터 입력됨
e = Entry(root, width=30)  # enter불가, 한줄로 txt를 받을 경우
e.pack()
e.insert(0, "한 줄만 입력해요")  # 처음에 아무런 입력값이 없으니 index 0이나 END나 똑같이 처음부터 입력


def btncmd():
    # 내용출력
    print(txt.get("1.0", END))  # "1.0" 1은 첫번째 줄부터 가져와라 0은 0번째 컬럼부터 가져와라
    # 그래서 END 끝까지 다 가져와라
    print(e.get())

    # 내용 삭제
    txt.delete("1.0", END)
    e.delete(0, END)


btn = Button(root, text="클릭", command=btncmd)
btn.pack()

root.mainloop()  # 창이 닫히지 않게 해주는 것

text와 entry둘다 텍스트 박스를 만들어주는 위젯이지만 

text는 박스의 크기를 정할 수 있고 

entry는 박스의 크기를 정할 수없음 , 한 줄의 박스 형태밖에 못만든다.

text

txt = Text(root, width=30, height=5)
txt.pack()

width= 글자수 크기, height = 글자수 크기

 

 

 

insert()

txt.insert(END, "글자를 입력하세요")

text상자에 속성값을 미리 지정해 놓는 방법도 있다. 

END가 의미하는것은 값의 맨 끝에 위치에 "텍스트"문을 추가한다는 소리 

현제는 값이 아무것도 없기 때문에 맨처음 (0)과 마찬가지 

Entry()

e = Entry(root, width=30)  # enter불가, 한줄로 txt를 받을 경우
e.pack()
e.insert(0, "한 줄만 입력해요")  # 처음에 아무런 입력값이 없으니 index 0이나 END나 똑같이 처음부터 입력

entry()는 한줄로 txt를 받는 아이디 비번이라던가 그런 경우에 사용된다. 

Button을 이용해 이벤트 가능

def btncmd():
    # 내용출력
    print(txt.get("1.0", END))  # "1.0" 1은 첫번째 줄부터 가져와라 0은 0번째 컬럼부터 가져와라
    # 그래서 END 끝까지 다 가져와라
    print(e.get())

    # 내용 삭제
    txt.delete("1.0", END)
    e.delete(0, END)


btn = Button(root, text="클릭", command=btncmd)
btn.pack()

root.mainloop()  # 창이 닫히지 않게 해주는 것

get()

print(txt.get("1.0", END))  # "1.0" 1은 첫번째 줄부터 가져와라 0은 0번째 컬럼부터 가져와라
    # 그래서 END 끝까지 다 가져와라
    print(e.get())

text인 경우에는 너비가 있기 때문에, 글을 가져올 위치를 정할 수 있다.

위에서 "1.0"에서 1이 의미하는 것은 첫번째 줄부터 가져와라, 0이 의미하는 것은 0번째 컬럼부터 가져와라

END는 끝까지 가져와라라는 의미이다.

 

entry에서는 get()만 사용하면 된다.

delete()

# 내용 삭제
    txt.delete("1.0", END)
    e.delete(0, END)

삭제하는 경우에는 text, entry 둘다 어디부터 어디까지 삭제할지를 정해줘야한다. 


 

listbox 위젯

from tkinter import *

root = Tk()
root.title("Jong GUI")  # 타이틀명 지정
root.geometry("640x480")  # 가로 x 세로의 크기 지정

listbox = Listbox(root, selectmode="extended", height=0)  # single은 한가지만  선택가능
# extended는 여러개 선택가능
# height 값이 0이되면 리스트에 포한된것을 전부 한번에 보여줌
# 만약 3으로 지정하면 3칸만 보여주고 나머지는 스크롤로 볼 수 있게됨
listbox.insert(0, "딸기")  # insert값을 추가할 때
listbox.insert(1, "사과")
listbox.insert(2, "딸기")
listbox.insert(END, "수박")  # END는 가장 마지막에 넣어주겠다는 의미
listbox.insert(END, "바나나")
listbox.pack()


def btncmd():
    # listbox.delete(END)  # END 맨 뒤에 항목을 삭제 ,0 맨 앞 항목 삭제

    # # 개수 확인
    # print("리스트에느 ", listbox.size(), "개가 있어요")

    # 항목 확인
    # print("1번째 부터 3번째까지의 항복 : ", listbox.get(0, 2)) #시작과 끝 index를  지정

    # 선택된 항목 확인(index 위치로 반환)
    print("선택된 항목 : ", listbox.curselection())  # 항목이 index값으로 반환한다.


btn = Button(root, text="클릭", command=btncmd)
btn.pack()

root.mainloop()  # 창이 닫히지 않게 해주는 것

 

Listbox()

listbox = Listbox(root, selectmode="extended", height=0)  # single은 한가지만  선택가능

selectmode에서 extended는 list의 항목중 여러개를 선택할 수있고 

single을 하게 되면 한가지 밖에 선택을 못하게 된다. 

 

height는 listbox의 높이를 지정해주는데 0을 하게되면 목록전체를 다 보여줄 만큼의 높이가 된다.

3을 하게되면 3칸만 보이도록하고 나머지는 scroll형식으로 바뀐다. 

 

Insert()

역시나 값을 추가하기 위해서는 insert()를 사용

listbox.insert(0, "딸기")  # insert값을 추가할 때
listbox.insert(1, "사과")
listbox.insert(2, "딸기")
listbox.insert(END, "수박")  # END는 가장 마지막에 넣어주겠다는 의미
listbox.insert(END, "바나나")
listbox.pack()

 

insert할 index위치를 지정해줘야 한다.  END를 사용하면 가장 끝에 위치

 

Button을 이용한 이벤트

def btncmd():
    listbox.delete(END)  # END 맨 뒤에 항목을 삭제 ,0 맨 앞 항목 삭제

    # 개수 확인
    print("리스트에느 ", listbox.size(), "개가 있어요")

    항목 확인
    print("1번째 부터 3번째까지의 항복 : ", listbox.get(0, 2)) #시작과 끝 index를  지정

    선택된 항목 확인(index 위치로 반환)
    print("선택된 항목 : ", listbox.curselection())  # 항목이 index값으로 반환한다.


btn = Button(root, text="클릭", command=btncmd)
btn.pack()

delete()

 listbox.delete(END)

삭제할 index번호를 입력하게 되면 삭제됨 

size()

print("리스트에느 ", listbox.size(), "개가 있어요")

list 항목의 갯수를 알려주는 함수

get()

print("1번째 부터 3번째까지의 항복 : ", listbox.get(0, 2)) 

시작 인덱스, 끝 인덱스 까지의 항목의 내용을 가져옴

튜플타입

curselection()

print("선택된 항목 : ", listbox.curselection())

현재 GUI에서 선택된 list의 항목을 index의 위치로 반환해줌

 

현재 선택된 딸기,수박,바나나에 index번호를 튜플타입으로 반환


checkbox 위젯

from tkinter import *

root = Tk()
root.title("Jong GUI")  # 타이틀명 지정
root.geometry("640x480")  # 가로 x 세로의 크기 지정

checkvar = IntVar()  # Checkvar에 int형으로 값을 저장한다.
checkbox = Checkbutton(root, text="오늘하루 보지않기", variable=checkvar)
# checkbox.select()  # 자동 선택 처리
# checkbox.deselect()  # 선택 해제 처리
checkbox.pack()

checkvar2 = IntVar()
checkbox2 = Checkbutton(root, text="일주일 동안 보지 않기", variable=checkvar2)
checkbox2.pack()


def btncmd():
    print(checkvar.get())  # 값이 0 : 체크 x 값이 1 : 체크 o

    print(checkvar2.get())


btn = Button(root, text="클릭", command=btncmd)
btn.pack()

root.mainloop()  # 창이 닫히지 않게 해주는 것

Checkbutton()

checkvar = IntVar()  # Checkvar에 int형으로 값을 저장한다.
checkbox = Checkbutton(root, text="오늘하루 보지않기", variable=checkvar)
# checkbox.select()  # 자동 선택 처리
# checkbox.deselect()  # 선택 해제 처리
checkbox.pack()

text는 체크박스에 나타날 문구를 정하는 것이고

variable은 현재 체크 되어있는지 안되어있는지를 값을 변수에 저장시키기 위해서 사용된다. 

checkvar = IntVar()에서 IntVar()는  int형으로 값을 저장하기 위함

 

select()는 처음에 자동으로 체크 되어있도록하는

deselect()는 자동으로 선택 해제처리하는 기능

Button을 이용한 이벤트

def btncmd():
    print(checkvar.get())  # 값이 0 : 체크 x 값이 1 : 체크 o

    print(checkvar2.get())


btn = Button(root, text="클릭", command=btncmd)
btn.pack()

get()

print(checkvar.get())

checkvar의 값을 가져온다. 체크가 되어있을 때는 1, 체크가 안된 경우에는 0값을 반환

 


radiobutton위젯

from tkinter import *

root = Tk()
root.title("Jong GUI")  # 타이틀명 지정
root.geometry("640x480")  # 가로 x 세로의 크기 지정


#variable이 같은 것 끼리 하나의 한 묶음이 된다. 
#같은 variable 끼리만 서로 영향을 준다. 
Label(root, text="메뉴를 선택하세요").pack()

burger_var = IntVar()  # 인트형으로 값을 저장
btn_burger1 = Radiobutton(root, text="햄버거", value=1, variable=burger_var)
btn_burger1.select()
btn_burger2 = Radiobutton(root, text="치즈버거", value=2, variable=burger_var)
btn_burger3 = Radiobutton(root, text="치킨버거", value=3, variable=burger_var)

btn_burger1.pack()
btn_burger2.pack()
btn_burger3.pack()

Label(root, text="음료를 선택하세요").pack()
drink_var = StringVar()
btn_drink1 = Radiobutton(root, text="콜라", value="콜라", variable=drink_var)
btn_drink1.select()
btn_drink2 = Radiobutton(root, text="사이다", value="사이다", variable=drink_var)
btn_drink3 = Radiobutton(root, text="환타", value="환타", variable=drink_var)

btn_drink1.pack()
btn_drink2.pack()
btn_drink3.pack()


def btncmd():
    print(burger_var.get())  # 햄버거 중 선택된 라이도 항복의 값(value)를 출력
    print(drink_var.get())


btn = Button(root, text="주문", command=btncmd)
btn.pack()

root.mainloop()  # 창이 닫히지 않게 해주는 것

Radiobutton()

burger_var = IntVar()  # 인트형으로 값을 저장
btn_burger1 = Radiobutton(root, text="햄버거", value=1, variable=burger_var)
btn_burger1.select()
btn_burger2 = Radiobutton(root, text="치즈버거", value=2, variable=burger_var)
btn_burger3 = Radiobutton(root, text="치킨버거", value=3, variable=burger_var)

btn_burger1.pack()
btn_burger2.pack()
btn_burger3.pack()

value 값을 지정해주게 되고, variable을 통해서 그 value값을 해당 변수에 저장한다. 

select()는 처음부터 자동 선택되도록 

Button으로 이벤트

def btncmd():
    print(burger_var.get())  # 햄버거 중 선택된 라이도 항복의 값(value)를 출력
    print(drink_var.get())


btn = Button(root, text="주문", command=btncmd)
btn.pack()

get()

 print(burger_var.get())

어떤 burger를 선택했는지를 value값을 알수가 있다. 


combobox 위젯

# combobox는 따로 불러와야함
import tkinter.ttk as ttk
from tkinter import *

root = Tk()
root.title("Jong GUI")  # 타이틀명 지정
root.geometry("640x480")  # 가로 x 세로의 크기 지정

values = [str(i)+"일" for i in range(1, 32)]  # 1~31 까지의 숫자
combobox = ttk.Combobox(root, height=5, values=values)
combobox.pack()
combobox.set("카드 결제일")  # 최초 목록 제목 설정 / 버튼 클릭을 통한 값 설정도 가능

readonly_combobox = ttk.Combobox(
    root, height=5, values=values, state="readonly")
readonly_combobox.current(0)  # 0번째 인덱스 값 선택
readonly_combobox.pack()


def btncmd():
    print(combobox.get())
    print(readonly_combobox.get())


btn = Button(root, text="선택", command=btncmd)
btn.pack()

root.mainloop()  # 창이 닫히지 않게 해주는 것

 

combobox를 사용하기 위해서는 tkinter.ttk 모듈을 따로 import 해와야한다. 

import tkinter.ttk as ttk

편하게 쓰기위해 as로 약어처리 

 

 

values = [str(i)+"일" for i in range(1, 32)]  # 1~31 까지의 숫자
combobox = ttk.Combobox(root, height=5, values=values)
combobox.pack()
combobox.set("카드 결제일")  # 최초 목록 제목 설정 / 버튼 클릭을 통한 값 설정도 가능

values에는 combobox에 넣고싶은 value값들을 넣어준다.

set()을 통해 최초의 목록의 제목을 설정할 수 있음

 

위에 코드의 문제점은 사용자가 이상한 문자를 입력할 수 있기 때문에 잘본된 정보가 들어오는 경우가 있다.

이것을 해결하기 위해서

state

readonly_combobox = ttk.Combobox(
    root, height=5, values=values, state="readonly")
readonly_combobox.current(0)  # 0번째 인덱스 값 선택
readonly_combobox.pack()

state에 readonly라는 속성을주면 읽기 전용이기 때문에 따로 값을 지정하거나 입력하는것이 불가능하다. 

 

Button을 이용한 이벤트

def btncmd():
    print(combobox.get())
    print(readonly_combobox.get())


btn = Button(root, text="선택", command=btncmd)
btn.pack()

get()

def btncmd():
    print(combobox.get())
    print(readonly_combobox.get())

combobox에서 선택한 항목의 내용을 get을 통해 가져온다


progressbar 위젯

# progressbar 따로 불러와야함
import time
import tkinter.ttk as ttk
from tkinter import *

root = Tk()
root.title("Jong GUI")  # 타이틀명 지정
root.geometry("640x480")  # 가로 x 세로의 크기 지정

# progressbar는 진행상태를 알려줄 경우에 사용
indeterminate 정해지지 않은 , 언제 끝날지 모른다.
progressbar = ttk.Progressbar(root, maximum=100, mode="indeterminate")
progressbar = ttk.Progressbar(root, maximum=100, mode="determinate")
progressbar.start(10)  # 10ms 마다 움직임 / 실행을 시켜줌
progressbar.pack()


# def btncmd():
#     progressbar.stop()  # 작동 중지


# btn = Button(root, text="중지", command=btncmd)
# btn.pack()

p_var2 = DoubleVar()  # 진행값은 실수로도 진행 될 수 있기 때문에 Double
progressbar2 = ttk.Progressbar(root, maximum=100, length=150, variable=p_var2)
progressbar2.pack()


def btncmd2():
    for i in range(1, 101):  # 1~100
        time.sleep(0.01)  # 0.01초 대기

        p_var2.set(i)  # progress bar 의 값 설정
        progressbar2.update()  # for문이 동작할 때마다 ui적으로 업데이트 시켜줌
        print(p_var2.get())


btn = Button(root, text="시작", command=btncmd2)
btn.pack()

root.mainloop()  # 창이 닫히지 않게 해주는 것

 

현재의 진행상황을 알고싶을 때 사용한다. 

 

progress를 사용하기 위해서는 tkinter.ttk 모듈을 따로 import 해와야한다. 

import tkinter.ttk as ttk

 

Progressbar()

progressbar = ttk.Progressbar(root, maximum=100, mode="indeterminate")
progressbar = ttk.Progressbar(root, maximum=100, mode="determinate")
progressbar.start(10)  # 10ms 마다 움직임 / 실행을 시켜줌
progressbar.pack()

mode에서 indeterminate는 진행상태가 정해지지 않을 때, 언제 끝날지 모른다. 

determinate는 현재 진행상태가 어느정도인지 알수있다.

 

start(int) 는 (int)ms 마다 실행을 시켜줌으로 움직이게 한다. 

stop() 은 반대로 실행을 중지시킨다. 

 

 

실행정도를 수치로 확인하기 위해서 

p_var2 = DoubleVar()  # 진행값은 실수로도 진행 될 수 있기 때문에 Double
progressbar2 = ttk.Progressbar(root, maximum=100, length=150, variable=p_var2)
progressbar2.pack()

 

Progressbar()에variable를 통해서 p_var2라는 변수에 저장을하는데 DoubleVar() 즉 실수형태로 받아들인다. 

 

Button을 통한 이벤트 

def btncmd2():
    for i in range(1, 101):  # 1~100
        time.sleep(0.01)  # 0.01초 대기

        p_var2.set(i)  # progress bar 의 값 설정
        progressbar2.update()  # for문이 동작할 때마다 ui적으로 업데이트 시켜줌
        print(p_var2.get())


btn = Button(root, text="시작", command=btncmd2)
btn.pack()

sleep은 프로그램을 지정시간 만큼 정지시키는 역할을 한다. 

import를 통해스 time 모듈을 가져와야지 사용가능하다. 

 

for문으 통해서 p_var2에 값을 넣어준다. 

for문에 맞추서 progressbar가 동작하게 해주기 위해서 update()를 사용한다. 

현재 p_var2의 값, 즉 progressbar의 진행상태를 가져오기위해 get()을 사용 

 


menu위젯

from tkinter import *

root = Tk()
root.title("Jong GUI")  # 타이틀명 지정
root.geometry("640x480")  # 가로 x 세로의 크기 지정

menu = Menu(root)

menu_file = Menu(menu, tearoff=0)


def create_new_file():
    print("새 파일을 만듭니다")


def create_new_window():
    print("새 창을 만듭니다")


# File 메뉴
menu_file.add_command(label="New File", command=create_new_file)
menu_file.add_command(label="New Window", command=create_new_window)
menu_file.add_separator()  # 구분자 추가
menu_file.add_command(label="Open File...")
menu_file.add_separator()
menu_file.add_command(label="Save All", state="disable")  # 비활성화
menu_file.add_separator()
menu_file.add_command(label="Exit", command=root.quit)
menu.add_cascade(label="File", menu=menu_file)

# Edit메뉴 (빈값)
menu.add_cascade(label="Edit")

# languge 메뉴 추가 (radio 버튼을 통해서 택1)
menu_lang = Menu(menu, tearoff=0)
menu_lang.add_radiobutton(label="Python")
menu_lang.add_radiobutton(label="Java")
menu_lang.add_radiobutton(label="PHP")
menu.add_cascade(labe="languge", menu=menu_lang)

# View 메뉴 (check박스로 )
menu_view = Menu(menu, tearoff=0)
menu_view.add_checkbutton(label="Show Minimap")
menu.add_cascade(label="View", menu=menu_view)

root.config(menu=menu)

root.mainloop()  # 창이 닫히지 않게 해주는 것

 


messagebox 위젯

import tkinter.messagebox as msgbox
from tkinter import *

root = Tk()
root.title("Jong GUI")  # 타이틀명 지정
root.geometry("640x480")  # 가로 x 세로의 크기 지정

# 에러가 떳을 때 팝업이 뜨는 것이 메세지

# 기차 예매 시스템이라고 가정


def info():
    msgbox.showinfo("알림", "정상적으로 예매 완료되었습니다.")  # showinfo("알림타이틀", "알림 내용")


def warn():
    msgbox.showwarning("경고", "해당 좌석은 매진되었습니다.")


def error():
    msgbox.showerror("에러", "결제오류가 발생했습니다.")


def okcancel():
    msgbox.askokcancel("확인 / 취소", "해당 좌석은 유아동반석입니다. 예매하시겠습니까?.")


def retrycancel():
    response = msgbox.askretrycancel("재시도 / 취소", "일시적인 오류입니다. 다시 시도하시겠습니까?")

    print("응답 :", response)
    if response == 1:  # 네 ok
        print("재시도")

    elif response == 0:  # 아니요
        print("취소")


def yesno():
    msgbox.askyesno("예 / 아니요", "해당 좌석은 역방향입니다. 예매하시겠습니까?")


def yesnocancel():
    response = msgbox.askyesnocancel(
        title=None, message="예매 내역이 저장되지 않았습니다.\n 저장후 프로그램을 종료하시겠습니까?")

    print("응답 :", response)
    if response == 1:  # 네 ok
        print("예")

    elif response == 0:  # 아니요
        print("아니요")

    else:
        print("취소")

# 네 : 저장후 종료
# 아니요 : 저장하지 않고 종료
# 취소 : 프로그램 종료 취소 ( 현재 화면 계속 작업)


Button(root, command=info, text="알림").pack()
Button(root, command=warn, text="경고").pack()
Button(root, command=error, text="에러").pack()

Button(root, command=okcancel, text="확인취소").pack()
Button(root, command=retrycancel, text="재시도취소").pack()
Button(root, command=yesno, text="예 아니요").pack()
Button(root, command=yesnocancel, text="예 아니요 취소").pack()


root.mainloop()  # 창이 닫히지 않게 해주는 것

frame 위젯

from tkinter import *

root = Tk()
root.title("Jong GUI")  # 타이틀명 지정
root.geometry("640x480")  # 가로 x 세로의 크기 지정

Label(root, text="메뉴를 선택해주세요").pack(side="top")

Button(root, text="주문하기").pack(side="bottom")
# 버거 프레임
# relief = solid 테두리 , bd = 1 외각선 굵기
frame_burger = Frame(root, relief="solid", bd=1)
frame_burger.pack(side="left", fill="both", expand=True)  # 위치 정의

Button(frame_burger, text="햄버거").pack()
Button(frame_burger, text="치즈버거").pack()
Button(frame_burger, text="치킨버거").pack()

# 음료 프레임
frame_drink = LabelFrame(root, text="음료")
frame_drink.pack(side="right", fill="both", expand=True)

Button(frame_drink, text="콜라").pack()
Button(frame_drink, text="사이다").pack()


root.mainloop()  # 창이 닫히지 않게 해주는 것

scrollbar위젯

from tkinter import *

root = Tk()
root.title("Jong GUI")  # 타이틀명 지정
root.geometry("640x480")  # 가로 x 세로의 크기 지정

# 스크롤바는 위젯과 스크롤바를 하나의 프레임에 넣고 관리하는 것이 편하다
frame = Frame(root)
frame.pack()

scrollbar = Scrollbar(frame)
scrollbar.pack(side="right", fill="y")

# set이 없으면 스크롤을 내려도 다시 올라옴
listbox = Listbox(frame, selectmode="extended",
                  height=10, yscrollcommand=scrollbar.set)

for i in range(1, 32):  # 1~31일
    listbox.insert(END, str(i)+"일")

listbox.pack(side="left")

# 서로서로를 맵핑시켜줘야지 서로가 연동되서 동작을한다.
# listbox에서는 yscrollcommand로 scrollbar을 , scrollbar에서는 config command로 listbox을 맵핑
scrollbar.config(command=listbox.yview)

root.mainloop()  # 창이 닫히지 않게 해주는 것

frame 생성

frame = Frame(root)
frame.pack()

Scrollbar 생성

scrollbar = Scrollbar(frame)
scrollbar.pack(side="right", fill="y")

fill = "y" 를 이용해서 y축으로 scrollbar를 꽉 채움

side="right"를 이용해서 오른쪽에 위치시킴

listbox  생성

# set이 없으면 스크롤을 내려도 다시 올라옴
listbox = Listbox(frame, selectmode="extended",
                  height=10, yscrollcommand=scrollbar.set)

for i in range(1, 32):  # 1~31일
    listbox.insert(END, str(i)+"일")

listbox.pack(side="left")

extended는 여러개 선택가능 

insert() 를 이용해서 list박스에 추가시킨다. 

side = "left" listbox 왼쪽에 위치시킴

scrollbar와 listbox를 서로 맵핑해줘야한다.

listbox = Listbox(frame, selectmode="extended",
                  height=10, yscrollcommand=scrollbar.set)
scrollbar.config(command=listbox.yview)

 

그래야 서로 연동되서 동작을 할 수 있다. 

scrollbar.set 에서 set을 해줘야지만  스크롤바가 위로 초기화 되지않고 동작한다

 

scrollbar에서는 config(command = listbox.yview) 를 통해서 listbox와 연동을 시켜줌