Spring, 2019 School of CSE Pusan National University Python GUI 프로그래밍 Spring, 2019 School of CSE Pusan National University
학습목표 Python의 Tkinter 모듈을 사용하여 GUI(Graphic User Interface) 프로그래밍을 익힌다. 이와 더불어 이벤트 기반 프로그래밍이라는 프로그램의 구조화 방식을 소개한다.
루트 윈도우(Root Window) 루트 윈도우 작성 >>> from tkinter import * >>> window = Tk() >>> window.mainloop() 모든 Tkinter GUI 애플리케이션은 루트 윈도우를 만들어 변수에 참조를 저장하면서 시작한다.
기본 GUI 구현 위젯 추가 from tkinter import * window = Tk() label = Label(window, text="This is our label.") label.pack() window.mainloop() 루트 윈도우에 위젯을 추가함 레이블: 텍스트를 표시할 때사용 pack 메소드 레이블 위젯을 부모 위젯 안에 위치시키고, 부모 위젯의 크기를 필요한 만큼 재조정함
Tkinter 위젯 Tkinter 위젯 윈도우에 다양한 위젯을 추가할 수 있음
화면에 문자열 출력 StringVar() 이용 화면에 문자열 출력 from tkinter import * window = Tk() data = StringVar() data.set("Data to display") label = Label(window, textvariable=data) label.pack() window.mainloop() 가변 문자열 StringVar를 이용하여 프로그램의 GUI와 변수 사이의 상호 작용을 관리한다.
Tkinter 가변 타입 가변 타입 내용을 바꿀 수 있는 타입 Python 타입에 대응하는 가변 타입을 제공함
프레임 구성 프레임 구성하기 window = Tk() frame = Frame(window) frame.pack() frame2 = Frame(window, borderwidth=4, relief=GROOVE) frame2.pack() first = Label(frame, text="First label") first.pack() second = Label(frame2, text="Second label") second.pack() third = Label(frame2, text="Third label") third.pack() window.mainloop() 프레임 위젯: 프레임은 직접적으로 화면에 보이지 않지만, 다른 위젯을 구성하는 데 도움을 줌
입출력 GUI 프로그램 화면에 Label과 Entry를 이용하여 입출력 GUI 구현하기 엔트리 위젯 from tkinter import * window = Tk() frame = Frame(window) frame.pack() var = StringVar() label = Label(frame, textvariable=var) label.pack() entry = Entry(frame, textvariable=var) entry.pack() window.mainloop() 엔트리 위젯 사용자가 텍스를 입력할 수 있는 위젯 StringVar()과 엔트리를 연결하여 텍스트 입력을 구현할 수 있음
버튼 클릭 처리 # Initialization. from tkinter import * # The controller. def click(): counter.set(counter.get() + 1) if __name__ == '__main__' : # More initialization. window = Tk() # The model. counter = IntVar() counter.set(0) # The views. frame = Frame(window) frame.pack() button = Button(frame, text="Click", command=click) button.pack() label = Label(frame, textvariable=counter) label.pack() window.mainloop() 버튼 위젯 command=click은 사용자가 버튼을 누를 때 마다 click 함수를 호출하라고 알리는 이벤트 호출 방식이다.
카운터 제어 from tkinter import * window = Tk() # The model. counter = IntVar() counter.set(0) # Two controllers def click_up(): counter.set(counter.get() + 1) def click_down(): counter.set(counter.get() - 1) # The views. frame = Frame(window) frame.pack() button = Button(frame, text="Up", command=click_up) button.pack() button = Button(frame, text="Down", command=click_down) label = Label(frame, textvariable=counter) label.pack() window.mainloop() 버튼 위젯 카운터의 값을 올리고 내리는 프로그램
람다 함수(lambda function) 람다 함수란? 람다 함수(lambda function)는 이름이 없는 함수를 뜻한다. 람다 함수를 이용하면 이름을 주지 않고도 쓰고 싶은 곳 아무데서나 한 줄짜리 함수를 만들 수 있다. >>> lambda: 3 <function <lambda> at 0x00A89B30> >>> (lambda: 3)() 3 람다 함수에 변수를 설정하기 >>> (lambda x: 2 * x)(3) 6 >>> (lambda x, y: 2 * x + y)(3, 4) 10
람다 함수를 이용한 버튼 클릭 from tkinter import * window = Tk() # The model. counter = IntVar() counter.set(0) # General controller def click(var, value): var.set(var.get() + value) # The views. frame = Frame(window) frame.pack() button = Button(frame, text="Up", command=lambda: click(counter, 1)) button.pack() button = Button(frame, text="Down", command=lambda: click(counter, -1)) label = Label(frame, textvariable=counter) label.pack() window.mainloop()
화면 스타일: 글꼴 설정 from tkinter import * window = Tk() button = Button(window, text="Hello", font=("Courier", 14, "bold italic")) button.pack() window.mainloop()
화면 스타일: 컬러 설정 from tkinter import * window = Tk() button = Label(window, text="Hello", bg="green", fg="white") button.pack() window.mainloop()
레이아웃: pack from tkinter import * window = Tk() frame = Frame(window) frame.pack() label = Label(frame, text="Name") label.pack(side="left") entry = Entry(frame) entry.pack(side="left") window.mainloop()
레이아웃: grid from tkinter import * window = Tk() frame = Frame(window) frame.pack() label = Label(frame, text="Name:") label.grid(row=0, column=0) entry = Entry(frame) entry.grid(row=1, column=1) window.mainloop() grid 배치 관리자 윈도우와 프레임을 행(Row)과 열(Column)로 구성된 격자로 다를 수 있다.
텍스트 위젯 설정 from tkinter import * def cross(text): text.insert(INSERT, 'X' ) window = Tk() frame = Frame(window) frame.pack() text = Text(frame, height=3, width=10) text.pack() button = Button(frame, text="Add", command=lambda: cross(text)) button.pack() window.mainloop() 텍스트 위젯 여러 줄 텍스트를 담고 싶은 경우 텍스트 위젯을 사용함
체크버튼 설정 from tkinter import * window = Tk() frame = Frame(window) 체크버튼 설정 체크버튼 설정 from tkinter import * window = Tk() frame = Frame(window) frame.pack() red = IntVar() green = IntVar() blue = IntVar() for (name, var) in (('R' , red), ('G' , green), ('B' , blue)): check = Checkbutton(frame, text=name, variable=var) check.pack(side='left' ) def recolor(widget, r, g, b): color = '#' for var in (r, g, b): color += 'FF' if var.get() else '00' widget.config(bg=color) label = Label(frame, text='[ ]' ) button = Button(frame, text='update' , command=lambda: recolor(label, red, green, blue)) button.pack(side='left' ) label.pack(side='left' ) window.mainloop()
메뉴 설정(1/2) from tkinter import * import tkinter.filedialog as dialog def save(root, text): data = text.get('0.0' , END) filename = dialog.asksaveasfilename( parent=root, filetypes=[('Text' , '*.txt' )], title='Save as...' ) writer = open(filename, 'w' ) writer.write(data) writer.close() def quit(root): root.destroy() window = Tk() text = Text(window) text.pack() menubar = Menu(window) filemenu = Menu(menubar) filemenu.add_command(label='Save' , command=lambda : save(window, text)) filemenu.add_command(label='Quit' , command=lambda : quit(window)) menubar.add_cascade(label = 'File' , menu=filemenu) window.config(menu=menubar) window.mainloop()
메뉴 설정(2/2) 프로그램 구조 이 프로그램은 2개의 함수를 정의함 save 함수는 텍스트의 위젯 내용을 저장함 사용자에게 텍스트 파일의 이름을 묻는 표준 ‘Save as…’ 대화상자를 생성한다. quit 함수는 애플리케이션을 닫음
GUI 활용 예: 계산기 GUI 활용 예: 계산기 #-*- coding: utf-8 -*- #GUI를 만들어주는 tkinter 모듈을 불러 들임 from tkinter import * #이벤트 처리함수 def enter(btn): if btn == 'C': ent.delete(0, END) elif btn == '=': #eval()함수는 텍스트로된 입력된 수식 표현을 파이썬 코드로 변환후 실행합니다. ans = eval(ent.get()) ent.insert(0, ans) else: #C와 =을 제외한 버튼은 그대로 ent에 추가. ent.insert(END, btn) def quit(): root.destroy() root.quit() #창만들기 root=Tk() root.title('계산기') #숫자 입력란 만들기 ent=Entry(root) ent.insert(0, ' ') ent.pack(pady=5) #숫자 버튼 만들기 buttons = ['7410', '852=', '963+', 'C/*-'] for col in buttons: frm=Frame(root) frm.pack(side=LEFT) for row in col : btn=Button(frm, text=row, command=(lambda char=row: enter(char))) btn.pack(fill=X, padx=5, pady=5) #프로그램 실행 root.mainloop()
연습문제 온도 변환 프로그램 지역 변수에 화씨온도를 입력하여 섭씨 온도로 변환하는 함수를 작성하라 (F - 32) * 5/9 = C (F = 화씨, C = 섭씨)
요약 윈도우 화면을 구성하는 GUI 구성 요소들을 사용하는 방법을 학습하였다. 윈도우 루트 화면 작성 화면 프레임 구성 Label과 Entry를 이용한 입출력 GUI 구성 버튼 구현 화면 스타일 설정 화면 레이아웃 설정 텍스트 위젯 설정 계산기 프로그램 기반의 윈도우 응용 프로그램 작성 방법을 학습하였다.