본문 바로가기
컴퓨터/Python

[Python] tkinter 프로그래밍 GUI 제작

by stdFrog 2021. 10. 24.

tkinter GUI


사진 자료

파이썬엔 GUI 제작에 사용되는 라이브러리가 여럿 있는데 그중, 가장 흔히 접할 수 있는 게 tkinter이다.

문법이나 자료형 같은 기본적인 지식 없이 무작정 시작했기에 여러 글을 참고하여 작성했으며 작성자와 같은 초보들에게 조금이나마 도움되었으면 한다.

import pickle
import webbrowser
from tkinter import *
from os import path

# Create Binary File

ETC = list()

if path.exists('C:/Users/ETC.txt') == False:
    with open('C:/Users/ETC.txt','wb') as f:
        pass
else:
    with open('C:/Users/ETC.txt', 'rb') as f:
    	ETC = pickle.load(f)

# 바이너리 파일이 완전히 비어있으면 EOFError 반환
# 리스트 객체 읽고 쓰기 - Pickle
#====================================================================================#

def whichSelected():
    print ("At %s of %d" % (select.curselection(), len(ETC)))
    return int(select.curselection()[0])

def addEntry():
    ETC.append([NameVar.get(), URLVar.get(), SiteVar.get()])
    setSelect()
    with open('C:/Users/ETC.txt', 'wb') as f:
        pickle.dump(ETC,f)

def updateEntry():
    ETC[whichSelected()] = [NameVar.get(), URLVar.get(), SiteVar.get()]
    setSelect()
    with open('C:/Users/ETC.txt', 'wb') as f:
        pickle.dump(ETC,f)

def deleteEntry():
    del ETC[whichSelected()]
    setSelect()
    with open('C:/Users/ETC.txt', 'wb') as f:
        pickle.dump(ETC,f)

def loadEntry():
    lbName, lbURL, lbSite = ETC[whichSelected()]
    NameVar.set(lbName)
    URLVar.set(lbURL)
    SiteVar.set(lbSite)

def SearchEntry(): # 예외처리 미구현 / 기본 브라우저(사용자 설정)로 해당 사이트 접속
    open_site = ((ETC[whichSelected()][1]))
    a= open_site.find('https://')
    if a == -1:
        a = ("https://")+open_site
        webbrowser.open(a)
    else:
        webbrowser.open(open_site)

def setSelect () :
    ETC.sort()
    select.delete(0,END)
    for lbName,lbURL,lbSite in ETC :
        select.insert (END, lbName)
        
# 기능 구현(버튼)
#====================================================================================#

def MakeWindow():
    global NameVar, URLVar, SiteVar, select

    win = Tk()
    win.title("My Pocket")
    win.geometry("600x300")

    # 메뉴 생성 및 구성
    menubar = Menu(win)
    win.config(menu=menubar)
    filemenu = Menu(menubar, tearoff=0)
    menubar.add_cascade(label="File", menu=filemenu)
    filemenu.add_command(label="Exit", command=win.quit)
	
#    status_bar = Label(win,text='Bookmark        ', anchor=E)
#    status_bar.pack(fill=X, side=BOTTOM, ipady=5)

    frame1 = Frame(win)
    frame1.pack()

    # 라벨(레이블) 생성
    Label(frame1, text="  URL").grid(row=0, column=0, sticky=W)
    URLVar = StringVar()
    lbURL = Entry(frame1, textvariable=URLVar, width=40)
    lbURL.grid(row=0, column=1, pady=5, sticky=W)
    Label(frame1, text="Name").grid(row=1, column=0, sticky=W)
    NameVar = StringVar()
    lbName = Entry(frame1, textvariable=NameVar, width=40)
    lbName.grid(row=1, column=1, pady=5, sticky=W)
    Label(frame1, text="  Site").grid(row=2, column=0, sticky=W)
    SiteVar = StringVar()
    lbSite = Entry(frame1, textvariable=SiteVar, width=40)
    lbSite.grid(row=2, column=1, pady=5, sticky=W)

    frame2 = Frame(win)
    frame2.pack()

    # 버튼 생성
    b1 = Button(frame2,text=" Add  ",command=addEntry)
    b2 = Button(frame2,text="Update",command=updateEntry)
    b3 = Button(frame2,text="Delete",command=deleteEntry)
    b4 = Button(frame2,text=" Load ",command=loadEntry)
    b5 = Button(frame2,text="Search",command=SearchEntry)
    b1.pack(side=LEFT); b2.pack(side=LEFT)
    b3.pack(side=LEFT); b4.pack(side=LEFT)
    b5.pack(side=LEFT); # 버튼 정렬

    frame3 = Frame(win)
    frame3.pack()

    # 스크롤 / 리스트 박스 생성
    scroll = Scrollbar(frame3, orient=VERTICAL)
    select = Listbox(frame3, yscrollcommand=scroll.set, height=10, width=50)
    scroll.config (command=select.yview)
    scroll.pack(side=RIGHT, fill=Y)
    select.pack(side=LEFT,  fill=BOTH, expand=1, pady=5)

    return win

win = MakeWindow()
setSelect()
win.mainloop()

# 윈도우(메인) 구현
#====================================================================================#
 참고 및 인용 - https://www.openbookproject.net/py4fun/gui/tkPhone.html
반응형

'컴퓨터 > Python' 카테고리의 다른 글

[Python] tkinter 시계  (0) 2021.10.28

댓글