조건문(conditional)

if else 문

if False:
     print("True")
else:
    print("False") # False

if 4 > 3:
    print("a") # a
else :
    print("b")

 

input은 입력값을 string으로 처리하기 때문에 정수나 실수 타입의 값을 받을 때에는 형변환 해주어야 한다.

value = input("값을 입력해주세요: ")

if int(value) > 10:
    print("a")
else:
    print("b")

 

if else 문

day = input("요일을 입력해주세요(0~6): ")

if day == "0":
    print("휴무")
elif day == "6":
    print("단축영업")
elif day == "1":
    print("연장영업")
else:
    print("정상영업")

 

 

반복문(loops)

for 문

i = 0
sum = 0

for i in range(1, 101):
    sum = sum + i

print(sum)

 

while 문

progress = 0

while progress < 100:
    
    progress = progress + 1
    print(f"{progress}% completed")

 

 

파이썬은 별도의 세미콜론( ; )이 필요없이 개행하면 소스가 새로 시작한다는 의미이다.

 

데이터를 반복적으로 활용하거나 원하는 형식으로 조절하기 위해서는 데이터를 공간에 넣어야한다. 그러기 위해서는 변수를 선언해야한다.

# greeting이라고 하는 변수 선언
# 이 변수에 문자열 값을 할당
greeting = "안녕하세요:)"
print(greeting)

# 변수는 데이터를 변경해서 할당할 수 있는 공간
greeting = "반갑습니다:)"
print(greeting)

 

파이썬에서의 변수의 특징

  • 변수 사이에 공백 허용되지 않음
  • 단어 사이는 _(언더스코어)를 사용하여 연결
  • 변수를 선언하기 위한 문자열은 숫자/특수문자로 시작이 불가
  • 예약어 사용 불가
  • 가급적 소문자 사용
  • 오타 주의

 

문자열(Strings)

문자의 나열

 

대소문자 변환

city = "seoul" # Seoul, SEOUL, SEOul
print(city)

# 대문자
city.upper()
print(city.upper())

city = city.upper()
print(city)

# 소문자
city.lower()
print(city.lower())

city = city.lower()
print(city)

 

공백 제거

occupation = "   developer   "
print(occupation)

# 우측 공백 제거
occupation.rsplit()
print(occupation.rsplit())

# 좌측 공백 제거
occupation.lstrip()
print(occupation.lsplit())

# 양옆 공백 제거
occupation.strip()
print(occupation.split())

 

개행 및 공백

print("INFP\nENFP\nISTJ\nESTJ")
print("INFP\tENFP\tISTJ\tESTJ")

 

시작과 끝 제거

# 시작 제거
score = "점수:90"
print(score.removeprefix("점수:"))

# 끝 제거
score_2 = "75점"
print(score_2.removesuffix("점"))

 

수정

city = "서울 중구"
print(city.replace("서울", "서울시"))

 

f-string

si_1 = "용인"
gu_1 = "기흥"
address_1 = f"{si_1}시 {gu_1}구"
print(address_1)

si_2 = "서울"
gu_2 = "종로"

# 서울시 종로구
# 용인시 기흥구
# (시의 이름)시 (구의 이름)구
print(f"{si_1}시 {gu_1}구")
print(f"{si_2}시 {gu_2}구")

 

 

숫자(numbers)

 

정수의 계산

a = 2
b = 3

print(a + b) # 더하기
print(a - b) # 빼기
print(a * b) # 곱하기
print(a / b) # 나누기

print(a ** b) # 제곱

print(a + b * b)
print((a + b) * b) # 괄호

print(a // b) # 몫
print(a % b) # 나머지

 

실수(Float)의 계산

실수와 연산하는 수는 그 결과가 모두 실수이다.

x = 10.0
y = 0.3
z = 1

print(x - y)
print(x + y)
print(x * y)
print(x / y)

print(x + z)
print(x - z)
print(x * z)
print(x / z)

 

숫자 표현

# 언더스코어(_)
price = 12_349_000_000_000
print(price)

 

상수(contants)

상수로 선언된 변수는 재할당 되어서는 안된다.

PI = 3.141592

 

문자열 - 숫자 간의 변환

a = 100
b = "100"
c = "0.453"

a = str(a) # 문자열
b = int(b) # 숫자
c = float(c) # 실수

 

 

논리형(Bool, Boolean)

다른 언어들과 달리 파이썬에서는 불 값이 대문자로 시작한다.

print(3 > 2) # True
print(3 == 3) # True
print(3 == 3.0) # True
print(3 is 3.0) # False

 

 

명령 프롬프트

CLI에 텍스트를 입출력하는 방법

input("설치를 계속 진행하시겠습니까? (y/n): ")

text = input("출력할 텍스트를 입력해주세요: ")
print(text)

 

 

 

주석

주석을 사용하는 이유

  • 테스트를 위해 코드를 임시로 무효화 하기 위해서
  • 함수, 변수 등의 의미를 다른 개발자들과 협업을 위해 공유하기 위해서
  • 프로그램을 유지보수하고 체계적인 프로젝트 관리를 위해서

 

주석 사용법

# 한 줄 주석입니다.

"""
여러 줄 주석입니다.
여러 줄 주석입니다.
여러 줄 주석입니다.
"""

'''
여러 줄 주석입니다.
print{"test"}
'''

 

 

연습문제

1. 다음은 외부 라이브러리인 pygame을 파이썬에서 추가하기 위한 명령입니다. 옳은 것을 고르세요.

① pip install pygame

② pip upgrade pygame

③ pip setup pygame

pip download pygame

 

더보기

답 : 1

 

2. 다음 각 설명에 필요한 Pillow 함수를 쓰세요.

(1) 이미지 회전

(2) 이미지 밝게/어둡게

(3) 이미지 블러링/엠보싱

(4) 이미지 복사

(5) 이미지 확대/축소

(6) 이미지 좌우/상하 반전

 

더보기

답 : (1) rotate(각도)

(2) ImageEnhance.Brightness(이미지).enhance(밝기 값)

(3) filter(ImageFilter.BLUR) , filter(ImageFilter.EMBOSS)

(4) copy()

(5) resize((폭, 높이))

(6) transpose() 

 

3. [프로그램 2]를 다음과 같이 기능을 추가하거나 변경해 보세요.

    · 우주괴물이 화면의 위에서 아래로 지그재그로 내려오도록 하자. 또한 게임의 박진감을 위해서 우주괴물의 속도가 5~9가 되도록 조절하자.

    · 우주괴물을 맞힐 때마다 우주선의 그림이 다른 우주선으로 변경되도록 하자.

    · 우주괴물이 살아서 오른쪽 끝까지 도달하면 점수에서 1점을 빼자. 즉, 점수는 마이너스 점수도 나올 수 있다.

    · 만약, 우주선과 우주괴물이 부딪히면 5초간 화면을 멈추고, 게임 종료 메시지를 화면에 출력하자. 그리고 프로그램을 종료한다.

* 다른건 다 했는데 지그재그로 내려오게 하는걸 모르겠네요ㅠㅠ 아는 분 댓글 부탁드립니다

더보기

답 :

import pygame
import random
import sys


## 함수 선언 부분 ##
# @기능 2-5 : 매개변수로 받은 객체를 화면에 그리는 함수를 선언한다.
def paintEntity(entity, x, y) : 
   monitor.blit(entity, (int(x), int(y)))

# @기능 5-4 : 점수를 화면에 쓰는 함수를 선언한다.
def writeScore(score) :
    myfont = pygame.font.Font('NanumGothic.ttf', 20)      # 한글 폰트
    txt = myfont.render(u'파괴한 우주괴물 수 : ' + str(score), True, (255-r, 255-g, 255-b))
    monitor.blit(txt, (10, sheight - 40))
    
def writeMessage(text) :
    myfont = pygame.font.Font('NanumGothic.ttf', 50)      # 한글 폰트
    text = myfont.render(text, True, (255-r, 255-g, 255-b))
    monitor.blit(text, (swidth/2-200, sheight/2-30))

def crash() :
    writeMessage('우주선 폭파!! 게임 끝!')
    pygame.display.update()
    pygame.time.delay(5000)
    pygame.quit()
    sys.exit()

def playGame() :
    global monitor, ship, monster, missile 

    r = random.randrange(0, 256)
    g = random.randrange(0, 256)
    b = random.randrange(0, 256) 
    
     # @기능 2-2 : 우주선의 초기 위치 키보드를 눌렀을 때 이동량을 저장할 변수를 선언한다.
    shipX = swidth / 2  # 우주선 위치
    shipY = sheight * 0.8
    dx, dy = 0, 0  # 키보드를 누를때 우주선의 이동량
    
    # @기능 3-2 : 우주괴물을 랜덤하게 추출하고 크기와 위치를 설정한다.
    monster = pygame.image.load(random.choice(monsterImage))
    monsterSize = monster.get_rect().size                 # 우주괴물 크기
    monsterX = 0 
    monsterY = random.randrange(0, int(swidth * 0.3)) # 상위 30% 위치까지만
    monsterSpeed = random.randrange(5, 9)
    
    # 우주선을 랜덤하게 추출한다
    ship = pygame.image.load(random.choice(shipImage))
    shipSize = ship.get_rect().size

    # @기능 4-2 : 미사일 좌표를 초기화한다.
    missileX, missileY = None, None  # None은 미사일을 쏘지 않았다는 의미이다.

    # @기능 5-1 : 맞힌 우주괴물 숫자를 저장할 변수를 선언한다.
    fireCount = 0

    # 무한 반복
    while True :
        (pygame.time.Clock()).tick(50)  # 게임 진행을 늦춘다(10~100 정도가 적당)
        monitor.fill((r, g, b))              # 화면 배경을 칠한다.

        # 키보드나 마우스 이벤트가 들어오는지 체크한다.
        for e in pygame.event.get() :
            if e.type in [pygame.QUIT]  :
                pygame.quit()
                sys.exit()

            # @기능 2-3 : 방향키에 따라 우주선이 움직이게 한다.
            # 방향키를 누르면 우주선이 이동한다(누르고 있으면 계속 이동).
            if e.type in [pygame.KEYDOWN] :
                if e.key == pygame.K_LEFT : dx = -5
                elif e.key == pygame.K_RIGHT : dx = +5
                elif e.key == pygame.K_UP : dy = -5
                elif e.key == pygame.K_DOWN : dy = +5
                # @기능 4-3 : 스페이스바를 누르면 미사일을 발사한다.
                elif e.key == pygame.K_SPACE : 
                    if missileX == None :                     # 미사일을 쏜 적이 없다면
                        missileX = shipX + shipSize[0]/2    # 우주선 위치에서 미사일을 발사한다.
                        missileY = shipY

            # 방향키를 떼면 우주선이 멈춘다.
            if e.type in [pygame.KEYUP] :
                 if e.key == pygame.K_LEFT or e.key == pygame.K_RIGHT \
                    or e.key == pygame.K_UP or e.key == pygame.K_DOWN : dx, dy = 0, 0

        # @기능 2-4 : 우주선이 화면 안에서만 움직이게 한다.
        if (0 < shipX+dx and shipX+dx <= swidth-shipSize[0]) \
            and (sheight/2 < shipY+dy and shipY+dy <= sheight - shipSize[1]) :  # 화면의 중앙까지만
            shipX += dx
            shipY += dy
        paintEntity(ship, shipX, shipY)   # 우주선을 화면에 표시한다.

        # @기능 3-3 : 우주괴물이 자동으로 나타나 왼쪽에서 오른쪽으로 움직인다.
        monsterX += monsterSpeed
        monsterY += monsterSpeed
        if monsterY > sheight :
            monsterX = random.randrange(0, int(swidth * 0.3))
            monsterY = 0
            # 우주괴물 이미지를 무작위로 선택한다.
            monster = pygame.image.load(random.choice(monsterImage))
            monsterSize = monster.get_rect().size
            monsterSpeed = random.randrange(5, 9)
           
        paintEntity(monster, monsterX, monsterY)
        
        # 놓치면 점수 빼기
        if monsterY >= sheight:
            fireCount -= 1
        
        # @기능 4-4 : 미사일을 화면에 표시한다.
        if missileX != None :                          # 총알을 쏘면 좌표를 위로 변경한다.
            missileY -= 10
            if missileY < 0 :
                  missileX, missileY= None, None   # 총알이 사라진다.
        if missileX != None :           # 미사일을 쏜 적이 있으면 미사일을 그려준다.
            paintEntity(missile, missileX, missileY)
            # @기능 5-2 : 우주괴물이 미사일에 맞았는지 체크한다.
            if (monsterX < missileX and missileX < monsterX + monsterSize[0]) and \
                   (monsterY < missileY and missileY < monsterY + monsterSize[1]) :
                fireCount += 1

                # 우주괴물을 초기화(무작위 이미지로 다시 준비)
                monster = pygame.image.load(random.choice(monsterImage))
                monsterSize = monster.get_rect().size
                monsterX = 0
                monsterY =random.randrange(0, int(swidth * 0.3))
                monsterSpeed = random.randrange(1, 5)
                
                # 미사일을 초기화한다.
                missileX, missileY= None, None   # 총알이 사라진다.

        # @기능 5-3 : 점수를 화면에 쓰는 함수를 호출한다.
        writeScore(fireCount)
        
        # 화면을 업데이트한다.
        pygame.display.update()
        
        # 우주선이 우주괴물과 충돌했는지 체크
        if (shipX < monsterX and monsterX < shipX + shipSize[0]) and \
              (shipY < monsterY and monsterY < shipY + shipSize[1]) :
           crash()

        
## 전역 변수 선언 부분 ##
r, g, b = [0] * 3                # 게임 배경색
swidth, sheight = 500, 700  # 화면 크기
monitor = None               # 게임 화면
ship, shipSize = None, 0     # 우주선의 객체와 크기 변수

# @기능 3-1 : 랜덤하게 사용할 우주괴물의 이미지 10개를 준비한다.
monsterImage = ['monster01.png', 'monster02.png', 'monster03.png', 'monster04.png', \
                'monster05.png', 'monster06.png', 'monster07.png', 'monster08.png', \
                'monster09.png', 'monster10.png']
monster = None   # 우주괴물

missile = None     # 미사일


## 메인 코드 부분 ##
pygame.init()
monitor = pygame.display.set_mode((swidth, sheight))
pygame.display.set_caption('우주괴물 무찌르기')

# @기능 2-1 : 우주선 이미지를 준비하고 크기를 구한다.
ship = pygame.image.load('ship02.png')
shipSize = ship.get_rect().size

# @기능 4-1 : 미사일 이미지를 추가한다.
missile = pygame.image.load('missile.png')

playGame()

 

 

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

연습문제

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()

 

 

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

+ Recent posts