본문 바로가기
관/핫한 파이썬 공부

파이썬의 여러 모듈 공부하기 02.

by 4차원 박스 2019. 11. 2.

class 클래스가 등장하는 순간부터

프로그래밍은 클래스 기준으로 작성된다.

클래스 구성은 다음과 같다
1. 변수
2. 함수

규칙은 간단하다
대문자로 시작하는 함수 형태 이다.

사용은 다음과 같다.

변수=클래스( ) 형식으로 선언하여 
변수를 사용하는데 이 변수를 인스턴스 라고 부른다.

이때 클래스( ) 형태는 함수의 형태가 아닌가 헷갈리수 있다.
구분을 잘 하도록 하자


이때 클래스 안에 기본값으로 클래스의 이름을 담은 함수(즉 클래스 이름이 a 라면 같은 이름인 a함수가 있다.)를
만들어놔서 제공하기 때문에 사용할 수 있다. 이런것을 oop개념에서  생성자(constructor) 라고 한다.


따라서

from tkinter import *

window=Tk()
label=Label(window,text="hellow world")
label.pack()

window.mainloop() #이벤트 처리를 기다린다.

에서

window=Tk()를 생성자 라고 한다.



모듈 안에 클래스, 변수, 함수 있다.



이번시간에는 다음을 한다
버튼과 이벤트처리

이벤트핸들링 (event handling) 을 이벤트 처리 라고 한다.

이벤트란 컴퓨터에서 작동하는 여러가지로 무언갈 클릭할때나 누를때 일어나는 것이다.
이걸 처리하는게 이벤트 핸들링 이라한다.

버튼 이벤트를 만들고 사용하는 코드를 본다
Button[.......... , command=이벤트함수명] 이런식으로 사용한다
자세한건 다음 예시로 확인한다.


from tkinter import *

def ok():
    b1["text"]="확인됨"
def cancel():
    b2["text"]="취소되었다"
window=Tk()
b1=Button(window,text="확인",command=ok)
b2=Button(window,text="취소",command=cancel)

b1.pack()
b2.pack()

window.mainloop()


이 코드를 컴파일하면 버튼을 클릭하면 버튼의 문자가 위의 함수로 바뀐다

또한 만약 컴파일이 실행이 되지 않을 경우에는 우측하단의 콘솔창을 닫으면 
실행 될수도 있다.

from tkinter import *

def ok():
    b1["text"]="확인됨"
def cancel():
    b2["text"]="취소되었다"
window=Tk()
window.geometry("900x500+10+10")
window.title("버튼만들었다")
b1=Button(window,text="확인",command=ok)
b2=Button(window,text="취소",command=cancel)

b1.pack()
b2.pack()

label=Label(window,text="button")
label.pack()


window.mainloop()

이건 좀더 덧 붙여서 
창의 크기와 타이틀을 적어보는 창이다.



gui 구현의 기본

1. 위젯이나 여러 컴포넌트 알기
2. 배치하기(layout)배치 관리자 라고 한다.
3. 이벤트처리 혹은 이벤트핸들링


이중 2번에 속하는 배치에서 배치관리자(layout manager)는 3가지가 있다
1. pack : 부모 위젯안에 위젯을 압축
2. grid(격자,표같음) : 행렬 같은 위치 선택
3. place : 좌표를 입력시킨다.

이 3가지의 사용법을 인터넷으로 찾아서 익혀본다.

배치관리자는 여러개를 사용하면
어느것을 수정하거나 고치거나 만들때 
보다 다루기 쉽고 보기도 좋다.

다음 여러 예시로 확인한다.

from tkinter import *

def ok():
    b1["text"]="확인됨"
def cancel():
    b2["text"]="취소되었다"
window=Tk()
window.title("버튼만들었다")

f=Frame(window)

b1=Button(f,text="확인",command=ok)
b2=Button(f,text="취소",command=cancel)
b3=Button(f,text="팩으로 배치하기")
b4=Button(f,text="pack로 배치하기")

b1.pack(side=LEFT)
b2.pack(side=LEFT)
b3.pack(side=LEFT)
b4.pack(side=LEFT)

label=Label(window,text="레이블은 프레임과 다른위치에 배치하기")
label.grid(row=1,column=1) #라벨과 프레임 분리를 그리드로 하기
f.grid(row=3,column=1) #라벨과 프레임 분리를 그리드로 하기

window.mainloop()



다음은
그리드로 배치한 예시이다

from tkinter import *

def ok():
    b1["text"]="확인됨"
def cancel():
    b2["text"]="취소되었다"
window=Tk()
window.title("버튼만들었다")

f=Frame(window)
l=Label(window,text="레이블은 프레임과 다른위치에 배치하기")

l.grid(row=0,column=0) #라벨과 프레임 분리를 그리드로 하기
f.grid(row=1,column=0) #라벨과 프레임 분리를 그리드로 하기

b1=Button(f,text="확인",command=ok)
b2=Button(f,text="취소",command=cancel)
b3=Button(f,text="그리드로 배치하기")
b4=Button(f,text="grid로 배치하기")

b1.grid(row=0,column=0)
b2.grid(row=1,column=0)
b3.grid(row=2,column=0)
b4.grid(row=3,column=0)


window.mainloop()


다음은 플레이스로 배치한 내용이다.
(리사이즈블을 사용하면 좋다)

from tkinter import *

def ok():
    b1["text"]="확인됨"
def cancel():
    b2["text"]="취소되었다"
window=Tk()
window.title("버튼만들었다")
window.resizable(False,False) #확대창 없애는 역할이다.

f=Frame(window)
l=Label(window,text="레이블은 프레임과 다른위치에 배치하기")

l.grid(row=0,column=0) #라벨과 프레임 분리를 그리드로 하기
f.grid(row=1,column=0) #라벨과 프레임 분리를 그리드로 하기

b1=Button(f,text="확인",command=ok)
b2=Button(f,text="취소",command=cancel)
b3=Button(f,text="그리드로 배치하기")
b4=Button(f,text="grid로 배치하기")

b1.place(x=10,y=10)
b2.place(x=20,y=10)
b3.place(x=10,y=20)
b4.place(x=20,y=20)

window.mainloop()


이건 오류있다 버튼이 나타나지 않는다
그 이유는 버튼을 할당할때 프레임창에 할당하였기 때문이다.
f가 아니라 윈도우로 바꾸어주면 기능한다.

place 대신 pack으로 해야 작동한다.

아니면 다음과 같이 고친다
b1=Button(window,text="확인",command=ok)
b2=Button(window,text="취소",command=cancel)
b3=Button(window,text="그리드로 배치하기")
b4=Button(window,text="grid로 배치하기")


다음은 메시지 박스 나타내는 방법이다
버튼을 누르면 알림창이 뜬다.

from tkinter import *
from tkinter import messagebox as msg

def ok():
    b1["text"]="확인됨"
    msg.showinfo("메시지박스","확인버튼을 누를때 나오는 메시지 입니다")
def cancel():
    b2["text"]="취소되었다"
    msg.showinfo("메시지박스","취소버튼을 누를때 나오는 메시지 입니다")

window=Tk()
window.title("버튼만들었다")
window.geometry("900x500+100+100")
window.resizable(False,False)

f=Frame(window)
l=Label(window,text="레이블은 프레임과 다른위치에 배치하기")

l.grid(row=0,column=0) #라벨과 프레임 분리를 그리드로 하기
f.grid(row=1,column=0) #라벨과 프레임 분리를 그리드로 하기

b1=Button(window,text="확인",command=ok)
b2=Button(window,text="취소",command=cancel)
b3=Button(window,text="그리드로 배치하기")
b4=Button(window,text="grid로 배치하기")

b1.place(x=100,y=100,width=200, height=50)
b2.place(x=200,y=200,width=200, height=50)
b3.place(x=300,y=300,width=200, height=50)
b4.place(x=400,y=400,width=200, height=50)

window.mainloop()




소프트웨어 생명주기(life cycle)

1. requirements 요구사항 : 시장조사 및 분석
2. design 설계 : 화면설계서 즉 그림으로 그리는방식, rapidprototyping 
3. coding, implementation 구현
4. testing 테스트
5. operation 운영
6. maintenance 유지보수 후 1로 돌아가는 주기



여러위젯 사용법.

1. 라벨에서 이미지를 불러올수 있다.
폰트 찾는방법 제어판의 모양 및 개인설정의 글꼴에 있다.
(인스턴스 사용안하고 바로 .pack을 클래스사용 뒤에 붙여서 바로 붙일 수 있다.)

#label 위젯기능 살피기
from tkinter import *
window=Tk()
photo=PhotoImage(file="a1.GIF")
w=Label(window, image=photo)
w.pack()

Label(window,text="times 라는 폰트와 굵게한 이텔릭체 빨강색 글씨다",fg="red",font="Times 32 bold italic").pack()
Label(window,text="helvetica 라는 폰트와 굵게한 이텔릭체 초록색 글씨다",fg="green",font="Helvetica 32 bold italic").pack()

window.mainloop()
를 사용하면 이미지 파일이 없어서 일단 안나온다.



2. entry 텍스트 입력하기.

다음과 같게 한다.
#entry 위젯기능 살피기
from tkinter import *
def show():
    print("이름: %s \n 나이: %s" %(e1.get(),e2.get()))
    
p = Tk()

l1=Label(p,text="이름").grid(row=0)
l2=Label(p,text="나이").grid(row=1)

e1=Entry(p)
e2=Entry(p)

e1.grid(row=0,column=1)
e2.grid(row=1,column=1)

Button(p,text="보이기", command=show).grid(row=5,column=1, sticky=W, pady=4)

mainloop()


3. 그래픽 cansvas(직접 그래픽을 그리고 만드는것)

색상지정 rgb는 어느 프로그래밍에서나 같은 형식으로 지정할수 있다
#000000 앞 두자리부터 r,g,b 색상이며 16진수로 표시한다.

다음과 같이 한다.

#canvas 위젯기능 살피기
from tkinter import *
from tkinter.colorchooser import*
window=Tk()
w= Canvas(window, width=300, height=500)
w.pack()

rec=w.create_rectangle(50,25,100,50,fill="blue") #사각형
w.create_line(0,0,200,200) #선
w.create_line(0,0,300,100, fill="red") #선
w.create_polygon(10,10,150,110,250,20,outline="yellow",fill="#00ff00") #다각형
w.create_text(200,150,text="Canvas에 글자 그리기를 한다",font=("Times", 10),fill="black")#글자                

w.coords(rec,200,100,100,50) #사각형의 좌표변경

#img=PhotoImage(file="a1.gif") #일단 이미지부른다(안됨)

color=askcolor()
w.create_rectangle(50,25,200,100,fill=color[1])

window.mainloop()

이렇게하면 캔버스의 기능을 간단히 살펴볼수 있다



4.라디오버튼 체크박스 리스트박스 스핀박스 메뉴박스 등등 다른 기능도 있다.

이건 다음 글에 소개한다.

댓글