>>본문<<

 

오늘의 단어

annual / ripe / ancient / anxious / proper

 

 

annual

1. 매년의, 연례의
2. 연간의, 한 해의
3. (특히 아동용) 연감[연보]
4. 일년생 식물

 

예문

Midsummer is the second biggest holiday in the Swedish calendar, after Christmas Day, and marks the start of Sweden's annual five-week summer holiday season.

한여름은 스웨덴 달력에서 크리스마스 다음으로 두 번째로 가장 큰 공휴일이고 스웨덴의 매년 5주 여름 공휴일 기간의 시작이다.

 

The flowers at the annual flower show were a beautiful sight.

매년 열리는 꽃 전시회의 꽃들은 아름다운 광경이었다.

 

The rise takes the annual rate of inflation to 1.6%.

연간 상승 비율 1.6%가 폭등했다.

 

 

ripe

1. 익은

2. 숙성한

3. 고약한

 

예문

Flowers are blooming, berries are ripening and a wonderful summer lies ahead.

꽃들이 만개하고 열매가 익으며 멋진 여름이 다가온다.

 

This brie smells good and ripe.

이 브리치즈는 잘 숙성된 냄새가 난다.

 

There was a ripe smell from his socks.

그의 양말에서 고약한 냄새가 난다.

 

 

ancient

1. 고대의
2. 아주 오래된
3. 고대인(특히 고대 이집트인그리스인로마인)

 

예문

People have lived in this valley since ancient times.

고대부터 사람들은 이 산골짝에서 살아왔다.

 

 According to ancient Swedish tradition, if you pick seven different flowers and put them under your pillow on Midsummer Eve, you'll dream of your future spouse.

아주 오래된 스웨덴의 전통에 따르면 당신이 7가지 꽃을 한여름 밤 베개 밑에 둔다면 미래의 배우자를 꿈에서 보게 된다.

 

 

anxious

1. 불안해하는, 염려하는
2. 불안하게 하는, 불안해 보이는
3. 열망하는, 간절히 바라는

 

예문

They anxious about whether potatoes will be enough and if they will be ready in time.

그들은 감자가 충분할지, 그리고 제 시간 안에 준비될 것인지에 대해 염려했다.

 

It was getting late, and I was anxious to get home.

시간이 늦어져서 집에 가고 싶었다.

 

 

proper

1. 적절한, 제대로 된
2. (수준 등이) 제대로 된, 참된
3. (사회적·도덕적으로) 올바른[정당한/제대로 된]

 

예문

That's the combination that creates the proper Midsummer feeling.

그 조합이 제대로 된 한여름 느낌으로 만들어준다.

 

In those days it was considered not quite proper for young ladies to be seen talking to men in public.

그 당시에는 젋은 여자들이 공공장소에서 남자들과 이야기 하는 것을 올바르지 않다고 생각했다.

 

 

>>본문<<

 

오늘의 단어

elegant / bustle / enchant / predict / merge

 

 

elegant

1. 우아한
2. 품격 있는, 우아한
3. 명쾌한, 멋들어진

 

예문

Stockholm's elegant and bustling streets are empty.

스톡홀름의 우아하고 부산한 거리가 텅 빈다.

 

An elegant old woman was walking down the street.

품격 있는 노부인이 거리를 걷고 있었다.

 

 

bustle

1. 바삐 움직이다, 서두르다
2. 부산함, 북적거림
3. (과거 여자들이 치마 뒷부분을 불룩하게 하기 위해 입던) 치마받이 틀

 

예문

He bustled around the apartment, getting everything ready.

그는 아파트 주변을 바삐 돌며 모든 것을 준비했다.

 

The whole square was bustling with expectation.

온 광장이 기대로 북적거렸다.

 

 

enchant

1. 황홀하게[넋을 잃게] 만들다
2. 마술[마법]을 걸다

 

예문

The audience was clearly enchanted by her performance.

관객들은 분명히 그녀의 공연에 넋을 잃었다.

 

He was enchanted by stories of the Old West.

그는 옛 서부의 이야기에 빠져들었다.

 

 

predict

예견[예측]하다

 

예문

In history, the night before Midsummer Day was one of the year's eight magic nights where you could predict the future, and a sort of magic window to the future was open.

역사에 따르면 한여름 날의 전날 밤에는 일 년의 여덟 마법의 밤 중 하나로, 미래를 예견 할 수 있는 마법의 창문이 열렸다.

 

The hurricane is predicted to reach the coast tomorrow morning.

허리케인이 내일 아침 해변에 도달할 것이라 예측된다.

 

 

merge

1. 합병[병합]하다, 합치다
2. (서로 구분이 안 되게) 어우러지다[융합되다]

 

예문

They decided to merge the two companies into one.

그들은 두 회사를 하나로 병합하기로 결정했다.

 

Historically, there was a big haymaking feast, important for all people living in the countryside before the 1930s, and today that party has merged with the Midsummer festivities.

역사적으로 1930년대 전 시골 지역에 사는 사람들에게 중요한 건초 만들기 잔치가 크게 있었고 오늘날 한여름 축제와 합쳐졌다.

 

That is the area where our interests merge.

그것이 우리의 관심사가 어울어지는 영역이다.

 

 

연습문제

1. 다음 데이터베이스와 관련된 설명 중, 거리가 먼 것을 모두 고르세요.

① 파일 처리는 데이터의 양이 많을 때, 데이터베이스는 데이터의 양이 적을 때 적합하다.

② DBMS는 데이터베이스를 관리하는 소프트웨어 또는 시스템을 지칭한다.

③ DBMS 제품에는 오라클, SQL Sever, MySQL, Excel, PowerPoint 등이 있다.

④ SQLite는 가벼운 DBMS 중 하나다.

 

더보기

답 : 1, 3

해설 : 1번 파일 처리는 데이터의 양이 적을 때, 데이터베이스는 데이터의 양이 많을 때 적합하다.

           3번 Excel, PowerPoint는 DBMS 제품이 아니다.

 

2. MySQL, SQLite 등이 포함되는 데이터베이스 종류를 하나 고르세요.

① 계층형 DBMS

② 망 DBMS

③ 관계형 DBMS

④ 객체지향형 DBMS

 

더보기

답 : 3

 

3. 다음 각 항이 설명하는 용어를 쓰세요.

(1) 데이터가 표 형태로 표현된 것을 말한다.

(2) 테이블이 저장되는 저장소를 말한다.

(3) 사용자와 DBMS가 소통하기 위한 언어를 말한다.

(4) 회원테이블의 회원이름 열은 문자 형식, 출생년도는 숫자 형식으로 지정하는 것을 말한다.

 

더보기

답 : (1) 테이블, (2) 데이터베이스, (3) SQL, (4) 데이터 형식

 

4. 다음은 데이터베이스의 구축 과정입니다. 차례대로 나열하세요.

A. 응용 프로그램에서 활용
B. 데이터 조회
C. 데이터 입력
D. 테이블 생성
E. 데이터베이스 생성
F. DBMS 설치

 

더보기

답 : F - E - D - C - B - A

 

5. SQLite의 데이터 입력 과정입니다. 차례대로 나열한 것을 고르세요.

A. 테이블 만들기
B. 커서 생성

C. 데이터베이스 연결
D. 데이터베이스 닫기
E. 입력한 데이터 저장
F. 데이터 입력

① CBAFED

② ABCDEF

③ CABEFD

④ CDEFAB

 

더보기

답 : 1

 

6. 파이썬에서 데이터를 입력하는 코드입니다. 빈칸을 채우세요.

import sqlite3

con = sqlite3.connect("C:/CookPython/naverDB")
cur = [     ①     ]

while (True) :
    data1 = input("사용자ID ==> ")
    if data1 == "" :
        break;
    data2 = input("사용자이름 ==> ")
    data3 = input("이메일 ==> ")
    data4 = input("출생연도 ==> ")
    sql = "INSERT INTO userTable VALUES('" + data1 + "','" + data2 + "')"
    [     ②     ]
    
[     ③     ]
con.close()

 

더보기

답 : con.cursor(), cur.execute(sql), con.commit()

 

7. 다음은 데이터를 조회하는 코드의 일부입니다. 빈 칸을 채우세요.

con = sqlite3.connect("naverDB")
cur = [     ①     ]
sql = "SELECT * FROM userTable"
[     ②     ]

 

더보기

답 : ① con.cursor(), ② cur.fetchone

 

8. [응용예제 02]는 RAW 파일을 DB에 저장하고 화면에 출력하는 코드입니다. 이에 다음 기능을 추가하세요.

(1) [파일] >> [열기] 메뉴를 추가해서 원하는 RAW 파일을 선택해서 열도록 한다.

(2) [사진효과] 메뉴를 추가하고, 그 하위에 [밝게하기], [어둡게하기], [반전하기] 메뉴를 추가한다.

(3) [밝게하기], [어둡게하기], [반전하기]를 선택하면 데이터베이스의 테이블이 변경된 후에, 데이터베이스의 내용을 메모리로 불러와서 화면을 출력하도록 한다.

힌트 [사진효과]는 UPDATE문을 테이블에 실행해야 한다.

 

더보기

답 :

from tkinter import *
from tkinter.filedialog import *
from tkinter.simpledialog import *
import os.path
import math
import sqlite3

## 함수 선언 부분 ##
def func_open():
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename

    filename = askopenfilename(parent=window, filetypes=(("RAW 파일", "*.raw"), ("모든 파일", "*.*")))
    if filename == '':  # 대화상자에서 취소를 눌렀으면
        return

    if canvas != None:  # 기존에 열린 적이 있으면 제거
        canvas.destroy()

    # 파일 --> 메모리
    loadImage(filename)

    window.geometry(str(XSIZE) + 'x' + str(YSIZE))  # 윈도창 크기
    canvas = Canvas(window, height = XSIZE, width = YSIZE)
    paper = PhotoImage(width = XSIZE, height = YSIZE)
    canvas.create_image((XSIZE / 2, YSIZE / 2), image = paper, state = "normal")

    # 메모리 --> 화면
    loadImage(filename) # 파일 --> 데이터베이스
    loadDatabase() # 데이터베이스 --> 메모리
    displayImage(inImage) # 메모리 --> 화면

    canvas.pack()

def loadImage(fname) :  # raw --> DB
    global inImage, XSIZE, YSIZE
    con, cur = None, None
    row, col, data, sql = 0, 0, 0, ''
    con = sqlite3.connect("C:/CookPython/rawDB")  # DB가 저장된 폴더까지 지정
    cur = con.cursor()
    fp = open(fname, 'rb')
    for row in range(0, XSIZE) :
        for col in range(0, YSIZE) :
            data = int(ord(fp.read(1)))
            sql = "INSERT INTO rawTable VALUES(" + str(row) + "," + str(col) + "," + str(data) + ")"
            cur.execute(sql)

    fp.close()
    con.commit()
    con.close()

def loadDatabase() :  # DB --> 메모리
    global inImage, XSIZE, YSIZE
    con, cur = None, None
    row, col, data = 0, 0, 0
    record = None # 테이블에서 읽어온 한 행
    con = sqlite3.connect("C:/CookPython/rawDB")
    cur = con.cursor()  
    cur.execute("SELECT * FROM rawTable")
    # 빈 inImage 생성
    for i in range(0, XSIZE) :
        tmpList = []
        for k in range(0, YSIZE) :
            data = 0
            tmpList.append(data)
        inImage.append(tmpList)

    # 테이블 --> inImage
    while (True) :
        record = cur.fetchone()
        if record== None :
            break;
        row = record[0]; col = record[1]; data = record[2]
        inImage[row][col] = data
    
    con.close()

def displayImage(image) :
    global XSIZE, YSIZE
    rgbString = ""
    for i in range(0, XSIZE) :
        tmpString = ""
        for k in range(0, YSIZE) :
            data = image[i][k]
            tmpString += "#%02x%02x%02x " % (data, data, data)	# x 뒤에 한 칸 공백
        rgbString += "{" + tmpString +  "} "	# } 뒤에 한 칸 공백
    paper.put(rgbString)


def func_exit() :
    window.quit()
    window.destroy()

def brightPhoto() :
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename, addValue
    value = 0
    value = askinteger('밝게', '값 입력', minvalue=1, maxvalue=255)

    con = sqlite3.connect("C:/CookPython/rawDB")  # DB가 저장된 폴더까지 지정
    cur = con.cursor()
    sql = "UPDATE rawTable SET data = data +" + str(value)
    cur.execute(sql)
    sql = "UPDATE rawTable SET data = 255 WHERE data > 255"
    cur.execute(sql)
    sql = "UPDATE rawTable SET data = 0 WHERE data < 0"
    cur.execute(sql)
    con.commit()
    con.close()

    loadDatabase()  # 데이터베이스 --> 메모리
    displayImage(inImage)

def darkPhoto() :
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename, addValue
    value = 0
    value = askinteger('어둡게', '값 입력', minvalue=1, maxvalue=255)

    con = sqlite3.connect("C:/CookPython/rawDB")  # DB가 저장된 폴더까지 지정
    cur = con.cursor()
    sql = "UPDATE rawTable SET data = data -" + str(value)
    cur.execute(sql)
    sql = "UPDATE rawTable SET data = 255 WHERE data > 255"
    cur.execute(sql)
    sql = "UPDATE rawTable SET data = 0 WHERE data < 0"
    cur.execute(sql)
    con.commit()
    con.close()

    loadDatabase()  # 데이터베이스 --> 메모리
    displayImage(inImage)

def reversePhoto() :
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename, addValue
    con = sqlite3.connect("C:/CookPython/rawDB")  # DB가 저장된 폴더까지 지정
    cur = con.cursor()
    sql = "UPDATE rawTable SET data = 255 - data"
    cur.execute(sql)
    con.commit()
    con.close()

    loadDatabase()  # 데이터베이스 --> 메모리
    displayImage(inImage)

## 전역 변수 선언 부분
window, canvas, XSIZE, YSIZE = None, None, 256, 256
inImage = [] # 2차원 리스트 (메모리)

## 메인 코드 부분 ##
if __name__ == "__main__" :
    window = Tk()
    window.title("연습문제")
    canvas = Canvas(window, height = XSIZE, width = YSIZE)
    paper = PhotoImage(width = XSIZE, height = YSIZE)
    canvas.create_image((XSIZE/2, YSIZE/2), image = paper, state = "normal")

    # 테이블 초기화
    con = sqlite3.connect("C:/CookPython/rawDB")  # 소스코드가 저장된 폴더에 생성됨
    cur = con.cursor()
    cur.execute("DROP TABLE IF EXISTS rawTable")
    cur.execute("CREATE TABLE rawTable(row  int , col int, data int)") # 행,열,픽셀값
    con.commit()
    con.close()

    # 메뉴 추가
    mainMenu = Menu(window)
    window.config(menu = mainMenu)
    fileMenu = Menu(mainMenu)
    mainMenu.add_cascade(label = "파일", menu = fileMenu)
    fileMenu.add_command(label = "파일 열기", command = func_open)
    fileMenu.add_separator()
    fileMenu.add_command(label = "프로그램 종료", command = func_exit)

    photoMenu = Menu(mainMenu)
    mainMenu.add_cascade(label = "사진효과", menu = photoMenu)
    photoMenu.add_command(label = "밝게하기", command = brightPhoto)
    photoMenu.add_command(label = "어둡게하기", command = darkPhoto)
    photoMenu.add_command(label = "반전 이미지", command = reversePhoto)

    filename = 'RAW/tree.raw'  # C:/CookPython/RAW/tree.raw
    loadImage(filename)
    loadDatabase()
    displayImage(inImage)

    canvas.pack()
    window.mainloop()

 

 

*주의사항 : 제가 직접 푼 것이므로 틀린 부분이 있을 수 있습니다. 오타나 틀린 부분 지적 환영!

* 출판사 문의 결과 11번 문제에 이상이 있어 다음 쇄부터 문제 자체를 뺀다고 합니다.

 

연습문제

1. 객체지향과 관련된 설명입니다. 거리가 가장 먼 것을 하나 고르세요.

① 자바, C++ 등에서도 사용되는 개념이다.

② 클래스라는 핵심적인 단어를 사용한다.

속성은 색상, 속도 등 자동차의 상태를 표현한다.

기능은 변수 형태로 표현한다.

 

더보기

답 : 4

해설 : 기능은 메서드로 구현되며 객체의 상태를 나타내는 속성을 변수 형태로 표현한다.

 

2. 다음은 자동차의 클래스로 만든 코드입니다. 메소드에서 틀린 부분 2곳을 찾아서 맞게 고치세요.

class Car :
	color = ""
    speed = 0
    
    def upSpeed(value) :
    	speed += value

 

더보기

답 :

class Car :
	color = ""
    speed = 0
    
    def upSpeed(self, value) :
    	self.speed += value

 

 

3. 다음은 생성자에 대한 설명입니다. 거리가 먼 것을 모두 고르세요.

① 인스턴스가 생성되면 자동으로 호출되는 메서드이다.

② 생성자의 이름은 __initilaize()__로 사용한다.

생성자는 반드시 클래스 안에 1개 이상 코드로 작성해야 한다.

생성자는 여러 개 만들 수 있다.

 

더보기

답 : 2, 3

해설 : 2번 생성자의 이름은 __init__로 사용한다.

3번 생성자는 클래스 안에 작성하지 않아도 기본 생성자가 호출된다.

 

4. 속도를 50으로 초기화하는 클래스의 생성자 코드입니다. 빈칸을 채우세요.

class Horse :
	speed = 0
    [
    
                     ]

 

더보기

답 :

def __init__(self) :
	self.speed = 50

 

5. 인스턴스 변수와 클래스 변수에 대한 설명입니다. 거리가 먼 것을 모두 고르세요.

① 클래스 변수를 선언할 때는 static을 앞에 붙인다.

② 인스턴스 변수와 클래스 변수는 선언하는 시점에는 구분할 수 없다.

인스턴스 변수는 'self.변수명' 형식으로 사용한다.

클래스 변수는 아무 것도 붙이지 않고 '변수명' 형식으로 사용한다.

 

더보기

답 :  1, 4

해설 : 1번 클래스 변수를 선언할 때는 static을 앞에 붙이지 않아도 된다.

4번 클래스 변수는 '클래스명.클래스변수명', '인스턴스명.클래스변수명' 형식으로 사용한다. 

 

6. 다음은 클래스의 상속과 관련된 코드입니다. 코드의 실행 결과를 고르세요.

class Car :
    def method(self) :
        print("슈퍼 클래스")

class Sedan(Car) :
    def method(self) :
        print("서브 클래스")
    
myCar = Car()
mySedan = Sedan()
myCar.method()
mySedan.method()

① 서브 클래스

② 슈퍼 클래스

③ 슈퍼 클래스 서브 클래스

④ 서브 클래스 슈퍼 클래스

 

더보기

답 : 3

 

7. Car의 상속을 받는 RVCar 클래스를 정의하는 코드입니다. 빈칸을 채우세요.

class Car :
	speed = 0
    
    def upSpeed(self, value) :
        self.speed = self.speed + value

[          ] :
    seatNum = 0
    
    def getSeatNum(self) :
        return self.seatNum

 

더보기

답 : class RVCar(Car)

 

8. super( ) 메서드에 대한 설명입니다. 가장 옳은 설명을 고르세요.

① 클래스 메서드와 관련된다.

② 오버라이딩된 메서드에서 슈퍼 클래스의 메서드를 호출할 때 사용한다.

③ 'super.메서드( )' 형식으로 슈퍼 클래스의 메서드를 사용한다.

④ 'super.속성' 형식으로 슈퍼 클래스의 속성을 사용한다.

 

더보기

답 : 2번

해설 : 1번 super() 메서드는 클래스 메서드와 직접적인 관련이 없으며, 주로 상속 관계에서 부모 클래스의 메서드를 호출하는 용도로 사용된다.

3번  'super( ).메서드( )' 형식으로 슈퍼 클래스의 메서드를 사용한다.

4번 'super( ).속성' 형식으로 슈퍼 클래스의 속성을 사용한다.

 

9. 다음 각 설명을 보기 중에서 고르세요.

__repr__(), __le__(), __add__(), __del__(), __lt__(), __gt__(), __ge__(), __eq__(), __ne__()

(1) 인스턴스 사이의 비교 연산자(!=)가 사용될 때 호출되는 메서드다.

(2) 소멸자라고 부르며 인스턴스가 제거될 때는 자동으로 호출된다.

(3) 인스턴스 사이의 덧셈 작업이 일어나면 실행되는 메서드다.

(4) 인스턴스를 print( ) 함수를 이용해 출력할 때 실행되는 메서드다.

(5) 인스턴스 사이의 비교 연산자(<=)가 사용될 때 호출되는 메서드다.

 

더보기

답 : (1) __ne__(), (2) __del__(), (3) __add__(), (4) __repr__(), (5) __le__()

 

10. 다음은 파이썬의 추상 메서드를 위한 코드입니다. 빈칸에 들어갈 것을 고르세요.

class SuperClass :
    def method(self) :
        [          ]

class SubClass(SuperClass) :
    pass

sub = SubClass()
sub.method()

① raise ImplementedError( )

raise NotImplemented( )

raise Implemented( )

raise NotImplementedError( )

 

더보기

답 : 4

 

11. 다음 멀티 프로세싱 코드의 빈 부분을 채우세요.

import multiprocessing
import time

class RunningHorse :
    horseName = ''
    def  __init__(self, name) :
        self.horseName = name

    def runHorse(self) :
        for _ in range(0, 3) :
            horseStr = self.horseName + '~~ 달립니다.\n'
            print(horseStr, end = '')
            time.sleep(0.1) # 0.1초 멈춤

## 메인 코드 부분 ##
if __name__ == "__main__" :
    horse1 = [     ①     ]('@얼룩말')
    horse2 = [     ②     ]('#조랑말')

    mp1 = [     ③     ](target = horse1.runHorse)
    mp2 = [     ④     ](target = horse2.runHorse)

    mp1.start()
    mp2.start()

    mp1.join()
    mp2.join()

 

더보기

답 : RunningHorse, ② RunningHorse, ③ multiprocessing.Process, ④ multiprocessing.Process

 

12. 다음은 멀티 스레드를 위한 코드입니다. 빈칸에 들어갈 코드를 채우세요.

import threading
import time

class RunningHorse :
    horseName = ''
    def  __init__(self, name) :
        self.horseName = name
    def runHorse(self) :
        for _ in range(0, 3) :
            print(self.horseName)
            time.sleep(0.1)

horse1 = [     ①     ]('@얼룩말')
horse2 = [     ①     ]('#조랑말')
thead1 = threading.Thread(target = horse1.[     ②     ])
thead2 = threading.Thread(target = horse2.[     ②     ])
thead1.[     ③     ]()
thead2.[     ③     ]()

 

더보기

답 : RunningHorse, runHorse, start

 

13. [응용예제 02]를 수정해서 <Delete> 키를 누르면 마지막 원부터 제거되고, <BackSpace> 키를 누르면 마지막 사각형부터 제거되도록 하세요.

힌트 Backspace 키의 이벤트는 <BackSpace>이고, Delete 키의 이벤트는 <Delete>다

더보기

답 :

from tkinter import *
import math
import random


## 클래스 선언
class Shape:  # 슈퍼 클래스
    color, width = '', 0
    shX1, shY1, shX2, shY2 = [0] * 4  # 도형을 포함하는 두 점

    def drawShape(self):  # 추상 메소드
        raise NotImplementedError()


class Rectangle(Shape):  # 서브 클래스
    objects = None  # 사각형 선분 리스트

    def __init__(self, x1, y1, x2, y2, c, w):
        self.shX1 = x1
        self.shY1 = y1
        self.shX2 = x2
        self.shY2 = y2
        self.color = c
        self.width = w
        self.drawShape()

    def __del__(self):  # 사각형의 4개 선분을 제거함
        for obj in self.objects:
            canvas.delete(obj)

    def drawShape(self):  # 네모 그리기로 재정의
        sx1 = self.shX1;
        sy1 = self.shY1;
        sx2 = self.shX2;
        sy2 = self.shY2
        squreList = []
        squreList.append(canvas.create_line(sx1, sy1, sx1, sy2, fill=self.color, width=self.width))
        squreList.append(canvas.create_line(sx1, sy2, sx2, sy2, fill=self.color, width=self.width))
        squreList.append(canvas.create_line(sx2, sy2, sx2, sy1, fill=self.color, width=self.width))
        squreList.append(canvas.create_line(sx2, sy1, sx1, sy1, fill=self.color, width=self.width))
        self.objects = squreList  # 선분 리스트(=사각형)을 objects에 넣음.


class Circle(Shape):  # 서브 클래스
    objects = None

    def __init__(self, x1, y1, x2, y2, c, w):
        self.shX1 = x1
        self.shY1 = y1
        self.shX2 = x2
        self.shY2 = y2
        self.color = c
        self.width = w
        self.drawShape()

    def __del__(self):  # 원은 객체 1개만 제거
        canvas.delete(self.objects)

    def drawShape(self):  # 원형 그리기로 재정의
        sx1 = self.shX1;
        sy1 = self.shY1;
        sx2 = self.shX2;
        sy2 = self.shY2
        self.objects = canvas.create_oval(sx1, sy1, sx2, sy2, outline=self.color, width=self.width)


## 함수 정의 부분
def getColor():  # 임의의 색상 선택
    r = random.randrange(16, 256)  # 16진수로 변환시 0~A는 제외
    g = random.randrange(16, 256)
    b = random.randrange(16, 256)
    return "#" + hex(r)[2:] + hex(g)[2:] + hex(b)[2:]  # '#rrggbb' 형태로 만듬


def getWidth():  # 임의의 펜 두께 선택
    return random.randrange(1, 9)


## 이벤트 함수 정의 부분
def startDrawRect(event):
    global x1, y1, x2, y2, shapes
    x1 = event.x
    y1 = event.y


def endDrawRect(event):
    global x1, y1, x2, y2, shapes
    x2 = event.x
    y2 = event.y
    rect = Rectangle(x1, y1, x2, y2, getColor(), getWidth())  # 사각형 생성
    shapes.append(rect)  # 전체 도형 리스트에 추가


def startDrawCircle(event):
    global x1, y1, x2, y2, shapes
    x1 = event.x
    y1 = event.y


def endDrawCircle(event):
    global x1, y1, x2, y2, shapes
    x2 = event.x
    y2 = event.y
    cir = Circle(x1, y1, x2, y2, getColor(), getWidth())  # 원 생성
    shapes.append(cir)  # 전체 도형 리스트에 추가


def deleteObject(event, objType):  # 마지막 그린 원제거
    global shapes
    if len(shapes) != 0:  # 화면에 도형이 있으면 마지막 도형 제거
        for i in range(len(shapes) - 1, -1, -1):
            strObj = str(shapes[i])
            if strObj.find(objType) != -1:  # 원 또는 사각형 객체 확인
                del (shapes[i])
                break


def deleteCircle(event, objType):  # 마지막 그린 원제거
    global shapes
    if len(shapes) != 0:  # 화면에 도형이 있으면 마지막 도형 제거
        for i in range(len(shapes) - 1, -1, -1):
            strObj = str(shapes[i])
            if strObj.find(objType) != -1:  # 원 객체 확인
                del (shapes[i])
                break


def deleteRectangle(event, objType):  # 마지막 그린 사각형 제거
    global shapes
    if len(shapes) != 0:  # 화면에 도형이 있으면 마지막 도형 제거
        for i in range(len(shapes) - 1, -1, -1):
            strObj = str(shapes[i])
            if strObj.find(objType) != -1:  # 사각형 객체 확인
                del (shapes[i])
                break


## 전역  변수 선언
shapes = []  # 화면에 그려진 전체 도형 리스트
window = None
canvas = None
x1, y1, x2, y2 = None, None, None, None  # 클릭한 두 지점의 X, Y

## 메인 코드 부분 ##
if __name__ == "__main__":
    window = Tk()
    window.title("연습 문제")
    canvas = Canvas(window, height=300, width=300)

    window.bind("<Delete>", lambda event: deleteCircle(event, 'Circle'))
    window.bind("<BackSpace>", lambda event: deleteRectangle(event, 'Rectangle'))

    canvas.bind("<Button-1>", startDrawRect)
    canvas.bind("<ButtonRelease-1>", endDrawRect)

    canvas.bind("<Button-3>", startDrawCircle)
    canvas.bind("<ButtonRelease-3>", endDrawCircle)

    canvas.pack()
    window.mainloop()

 

 

*주의사항 : 제가 직접 푼 것이므로 틀린 부분이 있을 수 있습니다. 오타나 틀린 부분 지적 환영!

+ Recent posts