프로그램/파이썬(Python)

파이썬 GUI 샘플 소스 (Python GUI sample source)

EVEWorld 2021. 1. 14. 06:04

import time

import tkinter.ttk as tk

import tkinter.messagebox as msbx

from tkinter import *

 

root = Tk()

root.title("고시원 예약")

root.geometry("540x800+300+100")  # 가로 x 세로 + x좌표 + y좌표 (창 크기, xy좌표 지정하지 않으면 가변되게 나타남)

root.resizable(FalseTrue# x(너비), y(높이) 조절 가능 여부

 

# 버튼 기본

btn1 = Button(root, text="버튼1")

btn1.pack()

 

# 버튼 (너비와 높이 조절 (가변크기))

btn2 = Button(root, padx=10pady=3text="버튼222222222222")

btn2.pack()

 

# 버튼 (너비와 높이 조절 (고정크기))

btn3 = Button(root, width=20height=1text="버튼3333333333333333333333333333")

btn3.pack()

 

# 버튼 (색상)

btn4 = Button(root, fg="red"bg="yellow"text="버튼4")

btn4.pack()

 

# 이미지 버튼

photo = PhotoImage(file="sample.png")

btn5 = Button(root, image=photo)

btn5.pack()

 

toggle = True

text1 = ""

entry1 = ""

 

# Click event

def btncmd():

    print("버튼이 클릭")

 

    global toggle  # 전역변수임을 표현해야 루틴이 끝나도 toggle 변수는 사라지지 않는다. (가베지 콜렉션)

    global text1

    global entry1

    if toggle:

        text1 = txt1.get("1.0", END) # txt1(텍스트)의 라인1 번째, 컬럼 0에서 끝까지의 텍스트를 갖고 온다.

        entry1 = e.get() # entry의 값 갖기

        txt1.delete("1.0", END) # text 값 삭제

        e.delete(0, END) # entry 값 삭제

        lbl1.config(text="또 만나요")

        lstbox1.delete(END) # END리스트의 맨 끝 부터 삭제, 0은 처음부터 삭제

        # 리스트 박스 항목 개수

        print("리스트에는 {0} 개의 항목이 있습니다.".format(lstbox1.size()))

        # 리스트 박스의 값을 갖고 온다. 0번째부터 끝까지

        print("리스트 전체 내용은 {0} 입니다.".format(lstbox1.get(0, END)))

        toggle = False

    else:

        lbl1.config(text="안녕하세요.")

        print(text1)

        print(entry1)

        toggle = True

 

def lstSelection():

    # 선택된 항목 (인덱스값으로 반환)

    print("리스트에서 선택한 항목은 {0} 입니다.".format(lstbox1.curselection()))

    print("체크 박스 상태 : {0}".format(chkVar.get()))

    if chkVar.get()==0#체크 박스 토글

        chkVar.set(1)

    else:

        chkVar.set(0)

    print("선택한 메뉴는 {0} ".format(rdoVar.get()))

    print("선택한 일은 {0} ".format(cmb1.get())) # 인덱스가 아닌 값으로 반환

    prsbar1.stop() # 프로그래스바를 멈추게 한다.

    for i in range(1101): # 1 ~ 100

        time.sleep(0.01# 0.01초 대기

        p_var2.set(i) # 프로그래스바에 값 설정

        prsbar2.update() # ui 업데이트 (이것을 하지 않으면 제대로 동작하지 않는다.)

        print(p_var2.get())    

 

btn6 = Button(root, text="클릭 이벤트 버튼"command=btncmd)

btn6.pack()

 

btn7 = Button(root, text="리스트 이벤트 버튼"command=lstSelection)

btn7.pack()

 

#-----------------------------------------------------------------

# Label

 

lbl1 = Label(root, text="안녕하세요")

lbl1.pack()

 

lbl2 = Label(root, image=photo)

lbl2.pack()

 

#-----------------------------------------------------------------

# text (메모장), entry(한줄 입력)

txt1 = Text(root, width=50height=3)

txt1.insert(END, "여러 줄 글자를 입력하세요.")

txt1.pack()

 

e = Entry(root, width=30)

e.insert(0"한줄만 입력")

e.pack()

 

#-----------------------------------------------------------------

# listbox, scrollbar

# extended는 다중 선택 가능, single은 하나만 선택, height의 0은 리스트 값을 모두 보여주는 높이

Frame1 = Frame(root)

Frame1.pack()

 

scroll1 = Scrollbar(Frame1)

scroll1.pack(side="right"fill="y")

 

lstbox1 = Listbox(Frame1, selectmode="extended"height=3yscrollcommand=scroll1.set) 

lstbox1.insert(0"사과")

lstbox1.insert(1"바나나")

lstbox1.insert(2"딸기")

lstbox1.insert(3"토마토")

lstbox1.insert(4"배")

lstbox1.insert(5"옥수수")

lstbox1.insert(END, "호도"# END 를 쓰면 무조건 맨 끝에 넣는다.

lstbox1.pack(side="left")

 

scroll1.config(command=lstbox1.yview)

 

#-----------------------------------------------------------------

# checkbox

chkVar = IntVar() # chkVar에 int형으로 값 저장 한다는 의미

chk1 = Checkbutton(root, text="오늘 하루 이창을 보지 않겠습니다."variable=chkVar)

chk1.select() # 자동 선택 deselect() 는 반대

chk1.pack()

 

#-----------------------------------------------------------------

# radiobox

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

 

rdoVar = IntVar() # rdoVar에 int형으로 값 저장 한다는 의미

rdo1 = Radiobutton(root, text="햄버거"value=1variable=rdoVar)

rdo1.select()

rdo2 = Radiobutton(root, text="치킨"value=2variable=rdoVar)

rdo3 = Radiobutton(root, text="피자"value=3variable=rdoVar)

rdo1.pack()

rdo2.pack()

rdo3.pack()

 

#-----------------------------------------------------------------

# combobox

 

values = [str(i) + "일" for i in range(132)] # 1 ~ 31까지의 숫자

cmb1 = tk.Combobox(root, height=5values=values, state="readonly")

# cmb1.set("카드 결제일") 

cmb1.current(0)

cmb1.pack()

 

#-----------------------------------------------------------------

# Progressbar

# indeterminate는 결정되지 않은 작업의 경우

# determinate는 채워지게 보여주는 경우

prsbar1 = tk.Progressbar(root, maximum=100mode="determinate")

prsbar1.start(10# 10ms 마다 움직인다.

prsbar1.pack()

 

p_var2 = DoubleVar()

prsbar2 = tk.Progressbar(root, maximum=100length=150variable=p_var2)

prsbar2.pack()

 

#-----------------------------------------------------------------

# Menubar

def create_new_file():

    print("새 파일을 만듭니다.")

 

menu1 = Menu(root)

 

# Sub Menu

menu_file = Menu(menu1, tearoff=0)

menu_file.add_command(label="New File"command=create_new_file)

menu_file.add_command(label="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)

 

menu1.add_cascade(label="File"menu=menu_file) # Main Menu1

menu1.add_cascade(label="Edit"# Main Menu2

 

# Language 메뉴 추가 (라디오버튼을 통해서 선택 가능)

menu_lang = Menu(menu1, tearoff=0)

menu_lang.add_radiobutton(label="Python")

menu_lang.add_radiobutton(label="Java")

menu_lang.add_radiobutton(label="C++")

menu1.add_cascade(label="Language"menu=menu_lang)

 

menu_chk = Menu(menu1, tearoff=0)

menu_chk.add_checkbutton(label="Show Form1")

menu_chk.add_checkbutton(label="Show Form2")

menu_chk.add_checkbutton(label="Show Form3")

menu1.add_cascade(label="Show Form"menu=menu_chk)

 

root.config(menu=menu1)

 

#-----------------------------------------------------------------

# MessageBox

def popmsg():

    # msbx.showinfo("알림", "정상적으로 예매 완료")

    # msbx.showwarning("경고", "경고 메세지")

    # msbx.showerror("오류", "오류 메세지")

    # msbx.askokcancel("선택", "오케이 캔슬?")

    response = msbx.askokcancel("선택""오케이 캔슬?")

    print("응답 : {0}".format(response))

    if response == 1:

        print("오케이")

    else:

        print("캔슬")



Button(root, command=popmsg, text="알림").pack()

 

#-----------------------------------------------------------------

# Frame

# side : 화면 정렬

 

frame1 = Frame(root, relief="solid"bd=1# bd는 선 굵기

frame1.pack(side="left"fill="both"expand=True)

 

Button(frame1, text="햄버거").pack()

 

lbl_frame1 = LabelFrame(root, text="음료수")

Button(lbl_frame1, text="커피").pack()

Button(lbl_frame1, text="콜라").pack()

lbl_frame1.pack(side="right"fill="both"expand=True)

 

#-----------------------------------------------------------------

# Zip

# 합쳐주는 역활

kor = ["가""나""다""라"]

eng = ["A""B""C""D"]

 

print(list(zip(kor, eng)))

 

# 반대로 unzip 은 섞여 있는 리스트를 분리해 준다. (*을 쓰면 된다)

mixstr = [("가""A"), ("나""B"), ("다""C"), ("라""D")]

print(list(zip(*mixstr)))

# 결과값 : [("가", "나", "다", "라"), ("A", "B", "C", "D")]

kor, eng = zip(*mixstr) # 이렇게 쓰면 각각의 변수에 값이 셋팅된다.

 

root.mainloop()