본문 바로가기
프로그래밍 언어/Python

Python-클래스와 객체, GUI(tkinter), 버튼, 엔트리, 캔버스

by Ing_til_death 2021. 6. 16.

클래스: 좀 더 큰 범위에서 반복을 할 때 유용

 

1. 전역변수 활용 global result

 

2. 독립적인 프로그램이 필요하나 많이 필요하게 되면 일일히 더 추가하기는 그러니...

 

- class 함수(여러 함수가 집합, 무한정으로 별개의 함수를 만들 수 있다)

ex)

class Calculator(클래스 이름):   ##클래스 옆에 ()가 없다!       def __init__(self):  ##__init__ 메소드1    ##매개변수가 없어도 self 입력            self.result=0 ##클래스 안에 잇는 메소드 함수에서 변수를 지정할 때는 self.변수명=수식 or 입력 내용으로!            def add(self,num): ## add 메소드2     ##매개변수의 가장 처음은 self를 무조건 입력하고 그 다음 다른 매개변수!             self.result+=num            return self.result

 

cal1=Calculator()   ##Calculator 클래스로 만든 별개의 계산기 cal1,cal2(객체라고 한다.)cal2=Calculator()   ##클래스를 사용하면 계산기 수가 늘더라도 객체를 생성만 하면 되기에 간단히 명령 수행

 

print(cal1.add(3)) ---> 이런 식으로 클래스에 있는 함수를 불러온다. ## 객체.함수

 

(예시)

##reset은 초기화 ##increment는 증가 ## get은 값 도출

 

- 메소드 호출 방법

먼저 인스턴스 명=클래스명() 을 하여 클래스 호출. 이후 인스턴스명.메소드명()으로 메소드 호출.

 ex) a=counter() ##a라는 객체 생성 a.reset()

 

 

 객체

- 객체지향프로그래밍: 우리가 살고 있는 실제 세계가 객체들로 구성되어있다.

- 객체는 상태와 동작을 갖는다.

상태(state)는 객체의 속성,  ex) TV의 채널번호, 볼륨, 전원상태  -- 인스턴스 변수(필드)

동작(behavior)은 객체가 취할 수 있는 동작(기능)이다. ex) TV의 켜기, 끄기, 채널 변경, 볼륨 변경 -- 메소드 

 

#클래스: 객체에 대한 설계도이다. 클래스로부터 만들어지는 각각의 객체를 그 클래스의 인스턴스라고 한다. 

 

생성자: 객체가 생성될 때 객체를 기본값으로 초기화하는 특수한 메소드(객체끼리 독립적이긴하나 오류 감소를 위해) 

 

class 클래스 이름:

        def __init__(self,...): ##reset 메소드랑 동일하나, 객체가 생성되는 시점에서 자동으로 호출되는 차이가 있다. 

 

## self._매개변수명=매개변수 로 초기화

##self.__age , self__name 형태로  쓰는  이유는 = 뒤에  있는  age, name과 구분하기  위해  일반적으로  __를  활용 
self.__형태로  쓰는  연습을 하자 

인스턴스명=클래스명 일때 매개변수에 self 필요없다. 메소드 호출할 때도 self 필요x

 

ex) 하나의 클래스로 많은 객체 생성

class Car:  
      def __init__(self, speed, color, model): self.__speed = speed 
           self.__color = color 
           self.__model = model 
      def drive(self): 
           self.__speed = 60

 

dadCar = Car(0, "silver", "A6") 

momCar = Car(0, "white", "520d") 

myCar = Car(0, "blue", "E-class") 

 

ex) class 헷갈림 방지

 

#초기값을 0으로 해놓은 것. #여기서 name이랑 age를 받으면 뒤에 있는 메소드함수들한테도 전달이 된다. 그런데 print같은 건 없으니 obj=Student("Hong", 20)만 하면 매개변수 값 설정만 된 것.

 

class Student:  
    
    def __init__(self, name=None, age=0):  
       self.__name = name 
       self.__age = age 
    def getAge(self):   #접근자: 출력용  #대체로 접근자와 설정자 모두 있는 편.
       return self.__age 
    def getName(self): 
       return self.__name 
    def setAge(self, age): #설정자: 값 설정
       self.__age=age 
    def setName(self, name): 
       self.__name=name 


>>> obj=Student("Hong", 20)
>>> obj.getName()
결과: 'Hong'

 

- __str__메소드 ex) def__str__(self): str(a)+..... 

                   ex) def __str__(self): return '(%d, %d, %s)' % (self.__speed, self.__gear, self.__color)

 

 

● Gui 프로그래밍 (그래픽사용자인터페이스)

- tkinter: 파이썬에서 GUI를 개발할 때 필요한 모듈

 

ex) 윈도우창, 버튼 디자인

- 버튼과 이벤트 처리 vs 버튼이 아닌 경우는 그냥 Label(윈도우이름, text="")

b1=Button(윈도우이름,text="문자열") ##버튼 설정

b1.pack ##버튼 배치

 

- 버튼 2개 이상이면 b1, b2,.. 만들면 된다. 다만, CSS처럼 수직으로 배열된다. 

-->>> b1.pack(side=LEFT) b2.pack(side=LEFT) ..... 해주면 수평으로 배열된다.

pack(padx=숫자) 는 좌우여백을 숫자만큼 띄운다. pady는 위아래 여백

 

- 버튼의 텍스트 변경

b1["text"]="One" 을 적으면 기존 값에서 One 의 이름으로 버튼이 생성된다.

 

버튼 형태 pack()안에 포함되는

 

 

버튼과 이벤트의 연결

- 이벤트 처리는 메인프로그램에서(이벤트) 라이브러리 함수를 호출하고 콜백함수로 호출되는 것이다.

- button=Button(window, text="one", command=함수 이름) #함수를 호출하고 처리한다.

 

- 단순 위젯: ok, cancel 등 단순한 요소   -컨테이너: 위젯을 넣을 수 있는 상자

 

- 배치 관리자

(1) Grid 
– 격자 배치 관리자(grid geometry manager)는 테이블 형태의 배치. row와 column을 사용한다. 
(2) Pack
– 압축 배치 관리자(pack geometry manager)는 위젯들을 부모 위젯 안에 압축. 특별한 게 없다.
(3) Place
– 절대 배치 관리자(place geometry manager)는 주어진 위치에 위젯을 배치

 

- 색상

fg(전경, 글자 색깔), bg(배경) ex) button["fg"]="색깔" 혹은 Button(윈도위이름,text 문자열, bg="색깔") 도 가능

 

- 폰트

(폰트이름, 폰트의 크기, 폰트 스타일) 혹은 text문자열 뒤에 font="폰트이름 크기 스타일"도 가능

 

- 레이블의 색상과 폰트 변경하기

-- 그냥 Lable()설정 해놓은 걸 또 다른 Label()로 설정한다.

 

엔트리 위젯: 텍스트를 입력받거나 출력하기위한 기입창 생성

 

a=Entry(window)

a.grid(row=0,column=1) 로 하면 첫번째 행에서 entry 위젯 생성.

 

ex) 계산기 프로그램 ##eval()함수는 문자열로 입력된 수식을 계산해주는 역할!!

.configure 는 이벤트처리 후 발생되는 결과! ##쉽게 생각하자. 일단 컨테이너 박스 만들고, 박스 안에서 파이썬 수식입력 label로 만들고, 빈칸 entry 창 만들고, entry.bind를 만들어서 작동하도록, 그리고 다시 결과: 를 만들기위해 label을 또.

 

 

 

캔버스(그리기) # canvas=Canvas(window, width=, height=) 해준다!! : 캔버스 너비와 높이 설정.

- 캔버스 항목  ##create_ 옆에 붙일 것들

•  호(arc)  ex) canvas.create_arc(10,10,200,150,extent(각도)=90, style=ARC)
•  비트맵(bitmap, 내장  파일이나  XBM 파일  형식) 
•  이미지(image, BitmapImage나  PhotoImage 객체) •  직선(line) ##이미지를 불러오고나서 그린다.

ex) img=PhotoImage(file=-----) canvas.create_image(200,200,anchor=NW(북서쪽),image=img)
•  타원(oval, 원이나  타원) 
•  다각형(polygon) -() 안에 첫번째 꼭짓점의 좌표, 두번째, 세번째,,,,,
•  사각형(rectangle) 
•  텍스트(text) ex) canvas.create_text(100,100,text='sss')
•  윈도우(window)

 

 예제

 

1. 은행 계좌

 

## 클래스에 매개변수가 없지만 메소드에는 매개변수가 있다.

##다 하고나서 return(print는 임시저장해놓은 거 출력하는 느낌, return은 저장 완료)

 

 

 

2. 사칙연산 클래스 만들기

 

class FourCal: 
       def __init__(self, first, second): self._first = first 
             self._second = second 
       def setdata(self, first, second): 
            self._first = first 
            self._second = second 
       def add(self): 
            result = self._first + self._second return result 
       def mul(self): 
            result = self._first * self._second return result 
       def sub(self): 
            result = self._first - self._second return result 
       def div(self): 
            result = self._first / self._second return result

 

2가지 호출 방법

(1) a=Fourcal()   print(a.setdata(4,2))             (2) a=Fourcal(4,2) print(a.setdata())   

 

3. 클래스로 프레임 감싸기

 

##의문: self.hello 왜 self.가 붙은거지??? 함수 아닌가? ##fg="색깔"

4. 애니메이션

 

# 화살표 키로 공을 움직이고 싶다면, for문 대신에 def move_right(event): canvas.move(id,5,0) 하고나서

canvas.bind_all('<KeyPress-Right>',move_right) 를 한다!! -Up, -Down, -Left 도 있다.

# 그리고 조건문에 입력된 것을 변수로 사용하고 싶다면 event.keysym=="Up"과 같은 조건문 활용

 

 

 

 

댓글