반응형

이번 포스팅에서는 미니 게임을 pygame을 사용하여 만들어 보도록 하겠습니다.

preview

이 게임은 병아리가 폭탄을 피하고 부딪히면 게임이 종료되는 미니게임 입니다.

 

게임 구성

1. 게임 화면 설정하기

2. 플레이어 기능 만들기: 병아리

3. 에너미 기능 만들기: 폭탄

4. 그룹화하기

5. 배경 및 효과 음악 삽입

6. 게임 루프 설정

7. 충돌 판정 설정 및 게임종료

0. 사진, 음악 파일 등을 다운받을 수 있는 사이트

[사진]

1. https://pixabay.com/ko/

2. http://www.stickpng.com/

3. https://littledeep.com/

 

리틀딥

무료 일러스트를 찾고 있나요? 출처없이 상업적으로 사용 가능한 다양한 종류의 일러스트 디자인을 무료로 공유합니다! 지금 바로 확인해보세요!

littledeep.com

[음악]

1. https://www.bensound.com/

 

Royalty Free Music - Bensound

Synth Energetic Royalty-Free Music Track by Marcus also featuring funky guitars, bass and a retro be... An energetic Royalty Free Music by TwinsMusic featuring a fast drums base, claps, synths, brass, and... As featured on Netflix's Tiger King, a spirited

www.bensound.com

2. https://soundeffect-lab.info/

 

効果音ラボ - 商用無料、報告不用の効果音素材をダウンロード

2400音以上の音源を掲載したフリー効果音サイト。品質にこだわっており、テレビなどのプロの音響現場でも使われています。

soundeffect-lab.info

해외사이트는 페이지 번역기능을 사용해 효과음을 찾을 수 있습니다.

※저작권 범위를 잘 확인한 뒤 사용하세요.※

1. 게임 화면 설정하기

게임의 기본적인 틀을 설정해 줍니다.

저는 미리 준비한 게임 배경화면 이미지에 맞추어 660*440크기의 창을 만들어 주었습니다.

색상, 속도, 점수 등의 변수도 미리 만들어 준비해 줍니다.

게임 내 글자에 사용될 폰트도 미리 설정해 줍니다.

그 후 게임 배경화면 사진을 불러오고, 창 이름을 Mini Game으로 바꾸어 주겠습니다.

import pygame, sys
from pygame.locals import *
import random, time

pygame.init()

# 초당 프레임 설정
FPS = 60
FramePerSec = pygame.time.Clock()

# 색상 세팅(RGB코드)
RED = (255, 0, 0)
ORANGE = (255, 153, 51)
YELLOW = (255, 255, 0)
GREEN = (0, 255, 0)
SEAGREEN = (60, 179, 113)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
VIOLET = (204, 153, 255)
PINK = (255, 153, 153)

# 게임 진행에 필요한 변수들 설정
SPEED = 5  # 게임 진행 속도
SCORE = 0  # 플레이어 점수

# 폰트 설정
font = pygame.font.SysFont('Tahoma', 60)  # 기본 폰트 및 사이즈 설정(폰트1)
small_font = pygame.font.SysFont('Malgun Gothic', 20)  # 작은 사이즈 폰트(폰트2)
game_over = font.render("GG", True, BLACK)  # 게임 종료시 문구

# 게임 배경화면
background = pygame.image.load('background1.jpg')  # 배경화면 사진 로드

# 게임 화면 생성 및 설정
GameDisplay = pygame.display.set_mode((640, 440))
GameDisplay.fill(PINK)
pygame.display.set_caption("Mini Game")

 

2. 플레이어 기능 만들기

다음으로 병아리(플레이어)에 적용될 클래스를 생성해 보겠습니다.

플레이어 클래스 객체가 생성되면 자동으로

사진을 불러오고 위치 설정을 해 준다음

move 함수를 만들어 왼쪽 키보드를 누르면 왼쪽으로 이동하고,

오른쪽 키보드를 누르면 오른쪽으로 이동하는 함수를 만들어 주겠습니다.

그리고 추후 폭탄이랑 부딪혔을 때 다른 이미지로 바꿔주기 위해 충돌 시 위치를 return받도록 하겠습니다.

## 게임 내에서 동작할 클래스 설정 ##

## 플레이어에게 적용할 클래스
class Player(pygame.sprite.Sprite):
    # 플레이어 이미지 로딩 및 설정 함수
    def __init__(self):
        super().__init__()
        # 플레이어 사진 불러오기
        self.image = pygame.image.load('chick.png')
        # 이미지 크기의 직사각형 모양 불러오기
        self.rect = self.image.get_rect()
        # rec 크기 축소(충돌판정 이미지에 맞추기 위함)
        self.rect = self.rect.inflate(-20,-20)
        print("플레이어: ",self.rect)
        # 이미지 시작 위치 설정
        self.rect.center = (540, 390)

    # 플레이어 키보드움직임 설정 함수
    def move(self):
        prssdKeys = pygame.key.get_pressed()
        # 왼쪽 방향키를 누르면 5만큼 왼쪽 이동
        if self.rect.left > 0:
            if prssdKeys[K_LEFT]:
                self.rect.move_ip(-5, 0)
                position_p = self.rect.center
                return position_p
        # 오른쪽을 누르면 5만큼 오른쪽으로 이동
        if self.rect.right < 640:
            if prssdKeys[K_RIGHT]:
                self.rect.move_ip(5, 0)
                position_p = self.rect.center
                return position_p

 

3. 에너미(적) 기능 만들기

이번에는 적인 폭탄에 적용할 클래스를 작성해 주도록 하겠습니다.

플레이어와 마찬가지로, 이미지를 불러와 줍니다.

적은 나타날때 무작위 위치에서 나타날 수 있도록 random을 사용하겠습니다.

적의 움직임은 위에서 아래로만 떨어지므로 (0, speed)로 세팅해 줍니다.

그리고 화면 맨 아래에 떨어지면 새로 물체가 나타나도록 코드를 작성합니다.

적 하나를 피할 수록 점수가 올라가기 때문에, 충돌이 일어나지 않으면 SCORE에 +1해 줍니다.

폭탄도 플레이어와 부딪혔을 때 이미지를 바꾸기 위해 return값으로 위치를 돌려받습니다.

## 적에게 적용할 클래스
class Enemy(pygame.sprite.Sprite):

    # 적의 이미지 로딩 및 설정 함수
    def __init__(self):
        super().__init__()
        # 적 사진 불러오기
        self.image = pygame.image.load('boom2.png')
        # 이미지 크기의 직사각형 모양 불러오기
        self.rect = self.image.get_rect()
        # rec 크기 축소(충돌판정 이미지에 맞추기 위함)
        self.rect = self.rect.inflate(-20,-20)
        print("적: ", self.rect)
        # 이미지 시작 위치 설정
        self.rect.center = (random.randint(40, 600), 0)

    # 적의 움직임 설정 함수+ 플레이어 점수 측정
    def move(self):
        global SCORE

        # 적을 10픽셀크기만큼 위에서 아래로 떨어지도록 설정
        self.rect.move_ip(0, SPEED)  # x,y좌표 설정
        # 이미지 가 화면 끝에 있으면(플레이어가 물체를 피하면) 다시 이미지 위치 세팅 + 1점 추가
        if (self.rect.bottom > 440):
            SCORE += 1
            self.rect.top = 0
            self.rect.center = (random.randint(30, 610), 0)
        return self.rect.center

 

4. 그룹화하기

이제 플레이어와 에너미 객체를 각각 생성해 주고, 그룹화를 해 줍니다.

그룹화는 파워포인트의 그룹처럼 비슷한 역할을 하는 객체들을 묶어 어떤 동작을 할 때, 한번에 같이 적용이 될 수 있도록 해 줍니다.

플레이어는 1명이니까 나머지 적 객체를 그룹화 후, 

전체(플레이어+ 적) 을 합친 전체 그룹도 만들어 줍니다.

###### 게임 설정 ########
# 플레이어 및 적 개체 생성
P1 = Player()

E1 = Enemy()

# Sprites Groups 생성하기
# 게임 물체들을 그룹화 하여 그룹별로 접근하여 설정 시 용이하게 만들기
# 적(enemy) 객체 그룹화하기
Enemies = pygame.sprite.Group()
Enemies.add(E1)
# 전체 그룹을 묶기
All_groups = pygame.sprite.Group()
All_groups.add(P1)
All_groups.add(E1)

게임에서 적이 1초마다 새로 나타날 수 있도록 그룹화한 객체에 이벤트를 설정해 줍니다.

# 적 개체 1초(1000ms)마다 새로 생기는 이벤트 생성
increaseSpeed = pygame.USEREVENT + 1
pygame.time.set_timer(increaseSpeed, 1000)

 

5. 배경 및 효과 음악 삽입

게임을 하는동안 지루하지 않게 배경 음악을 추가하도록 하겠습니다.

배경음악은 게임 루프가 시작되기 전에 틀어 줍니다.

배경음악이나 기타 효과음을 넣고 싶지 않으면 생략하셔도 됩니다.

# 게임 BGM 설정
bgm = pygame.mixer.Sound('backgroundMusic.mp3')
bgm.play() # 게임 BGM 재생

 

6. 게임 루프 설정

이제 게임이 진행되는 동안 반복될 이벤트들을 설정해 줍니다.

게임 루프에서 플레이어가 적을 잘 피할수록 적의 떨어지는 스피드를 올려 점점 어렵게 만들어 주겠습니다.

그리고 종료선언이 되면 게임을 종료시키는 코드도 미리 작성해 줍니다.

.blit()을 사용하여 배경화면을 창에 불러옵니다.

적을 몇명 피했는지 체크하는 score도 불러와 줍니다.

그 후 나머지 플레이어와 적 객체들도 화면에 나타내주고 함수 move를 사용하여 움직임이 생기도록 해 줍니다.

## 게임 루프 설정 ##
# 게임 종료되기 전까지 실행되는 루프(이벤트) 설정
while True:

    for event in pygame.event.get():
        # type increaseSpeed이면 속도 증가하여 어렵게 만듬(적 물체 이벤트)
        if event.type == increaseSpeed:
            SPEED += 0.5
        # 이벤트가 종료되면 게임도 종료시킴
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    # 배경화면 사진 게임창에 불러오기(사진, 위치)
    GameDisplay.blit(background, (0, 0))
    # 하단부에 위치할 스코어 점수(적을 피할때마다 +1점 증가)
    scores = small_font.render("Score: " + str(SCORE), True, BLACK)
    GameDisplay.blit(scores, (10, 400))

    #group1 = '<Player Sprite(in 1 groups)>'
    #group2 = '<Enemy Sprite(in 2 groups)>'

    # 게임 내 물체 움직임 생성
    for i in All_groups:
        GameDisplay.blit(i.image, i.rect)
        i.move()
        if str(i) == '<Player Sprite(in 1 groups)>':
            player_pos = i
        else:
            enemy_pos = i

7. 충돌 판정 설정 및 게임종료

이제 마지막으로 적과 플레이어 사이에 충돌이 있을 때 일어나는 이벤트들을 설정해 주도록 하겠습니다.

플레이어와 적이 충돌하면 kill을 사용하여 움직임을 다 멈춰 주고 게임 배경음악도 멈춰 줍니다.

그 후 미리 받아온 위치정보를 충돌 후 바뀔 이미지에 적용하여 화면에 나타내 줍니다.

충돌 할 때 나는 소리 파일도 불러와 줍니다.

그 후 화면이 바뀌며 게임 종료를 알리며 게임을 종료합니다.

# 플레이어 충돌 판정(게임종료)시
    if pygame.sprite.spritecollideany(P1, Enemies):
        for i in All_groups:
            i.kill()
        # 물체 이미지 변경(충돌후 변경되는 이미지)
        # 플레이어
        GameDisplay.blit(background, (0, 0))
        image0 = pygame.image.load('chickbommed.png')
        image0.get_rect()
        GameDisplay.blit(image0, player_pos)

        # 폭탄
        image1 = pygame.image.load('boomm.png')
        image1.get_rect()
        GameDisplay.blit(image1, enemy_pos)
        pygame.display.update()

        # 배경음악 멈춤
        bgm.stop()
        # 적과 충돌시 효과음 추가
        pygame.mixer.Sound('BOOM.WAV').play()
        time.sleep(0.5)
        # 게임오버화면 설정
        pygame.mixer.Sound('gameover.mp3').play()
        GameDisplay.fill(SEAGREEN)
        final_scores = font.render("Your Score: " + str(SCORE), True, BLACK)
        GameDisplay.blit(final_scores, (150, 100))
        GameDisplay.blit(game_over, (280, 200))
        time.sleep(1)
        pygame.display.update()
        time.sleep(5)
        pygame.quit()
        sys.exit()

    pygame.display.update()
    # 초당 프레임 설정
    FramePerSec.tick(FPS)

만든 게임을 실행할 때는 작성한 코드에서 바로 실행해 주셔도 되고

터미널에서 실행할 때는 코드파일이 위치한 폴더로 이동 후 아래와 같이 명령어를 입력하여 실행합니다.

python -m 게임파일이름.py

 

플레이 영상

 

 

전체 코드

https://github.com/ElenaLim/Pygame/blob/main/minigame.py

 

GitHub - ElenaLim/Pygame: Minigame using Pygame

Minigame using Pygame. Contribute to ElenaLim/Pygame development by creating an account on GitHub.

github.com

전체 코드 및 코드파일을 깃허브에 업로드 하였습니다. :)

 

참고자료

1. 파이게임 튜토리얼 문서

 

tutorials - pygame wiki

 

www.pygame.org

2. 파이게임 튜토리얼

 

Python pygame - The Full Tutorial - CodersLegacy

The Python Pygame library comes with modules with functions for graphics, playing sounds, handling mouse input, and other things required for making games.

coderslegacy.com

 

마무리

파이썬으로 이렇게 게임을 만들어 볼 수 있어서 정말 즐거웠습니다 ^o^

어떤 게임을 만들고 싶은지 아이디어가 있다면 댓글로 남겨 주세요:)

-----------------------------------------------------------

05/19 ++충돌판정 수정.

반응형
반응형

안녕하세요! 

python으로도 게임을 만들 수 있다는 사실을 알고 계신가요?

오늘은 pygame이라는 게임을 만들 수 있는 모듈을 가지고

파이썬으로 간단한 게임을 만들어 보도록 하겠습니다.

이번 포스팅은 pygame설치 방법과 간단한 사용 방법을 알아보도록 하겠습니다.

 

 Pygame 설치
pip install pygame

위의 명령어로 pygame을 설치해 주면 간단하게 설치가 완료됩니다.

vscode로 사용시

pygame을 검색후 아래와 같이

Pygame Snippets 의 install 버튼을 눌러 설치해도 됩니다. (저는 이미 설치가 되어있기 때문에 install 표시가 없습니다.)

그 후 잘 설치가 되었는지 알아보려면

명령 터미널에

python -m pygame.examples.aliens

입력 후

위의 창과 같은 게임이 실행된다면 잘 설치가 된 것입니다. ㅎㅎ

쉬어갈겸 게임 한번 씩 해보시길 바랍니다ㅎㅎ

방향키(← →)로 움직이고, 스페이스로 적을 공격하여 없앨 수 있습니다.

pygame 게임 제작 프로세스

pygame을 사용하여 게임을 만들 때 크게 4단계를 거쳐 진행됩니다.

1. game 시작 선언

2. 게임 윈도우(창) 설정 - 프레임, 컬러, 크기 등등

3. 게임에서 실행될 오브젝트 설정 및 게임루프에서 실행될 이벤트(함수) 설정

4. 게임 루프 설정 (게임이 진행되는 동안 실행되는 루프 및 게임종료 설정)

 

1. game 시작 선언

pygame의 시작을 알리는 init()을 선언한 후 게임 코드들을 작성하게 됩니다.

import sys
import pygame
from pygame.locals import *

## pygame 기능 사용을 시작하는 명령어 ##
pygame.init()

 

2. 게임 윈도우(창) 설정

그 후 게임이 시작될 기본 창을 생성하고

크기, 배경색, 초당 프레임 등등을 설정해 줍니다.

크기는 pygame.display.set_mode()를 사용하여 (가로,세로) 튜플을 넣어주면 생성됩니다.

초당 프레임 단위는 .tick()을 사용하여 보통 100이내로 설정해 줍니다. (적정선 30~60정도)

그 이상이되면 게임 용량이 커질 뿐만이 아니라 너무 빨리 지나가 사람 눈으로 확인하기 어려워집니다.

색상을 설정할 때는 RGB코드를 써서 색상을 지정해 줍니다. (ex: 검은색RGB코드 -> (0,0,0)) 

RGB 색상 코드 차트를 확인하려면 아래의 링크에서 확인해 주세요.

https://www.rapidtables.org/ko/web/color/RGB_Color.html

 

RGB 색상 코드 차트 🎨

RGB 색상 코드 차트 RGB 색상 선택기 | RGB 색상 코드 차트 | RGB 색 공간 | RGB 색상 형식 및 계산 | RGB 색상 표 RGB 색상 선택기 RGB 색상 코드 차트 색상 에 커서를 갖다 대면 아래의 16 진수 및 10 진수 색

www.rapidtables.org

게임 창의 이름을 설정하고 싶을 땐

pygame.display.set_caption("윈도우 이름")을 사용하여 설정할 수 있습니다.

## 초당 프레임 단위 설정 ##
FPS = 30
FramePerSec = pygame.time.Clock()

## 컬러 세팅 ##
BLUE = (0,0,255)
RED = (255,0,0)
GREEN = (0,255,0)
BLACK = (0,0,0)
WHITE = (255,255,255)

## 게임 창 설정 ##
GameDisplay = pygame.display.set_mode((640,440))
GameDisplay.fill(WHITE) #하얀색으로 배경 채우기
pygame.display.set_caption("PYGAME Example") # 창 이름 설정

 

 

3. 게임에서 실행될 오브젝트 설정 및 게임루프에서 실행될 이벤트(함수) 설정

도형 생성

pygame.draw.shape(surface, color, pointlist(centerpoint), width)로 도형을 그릴 수 있습니다.

각각의 파라미터는 아래와 같습니다.

  • surface: 어느 게임 창에 위치시킬 것인지 설정
  • color: 오브젝트 색상 설정
  • pointlist: 튜플형식으로 각 포인트(각)의 좌표를 설정
  • start_point, end_point, centerpoint: 시작 좌표, 끝점, 가운데 좌표
  • width: 도형 테두리 굵기 지정

도형은 아래와 같이 생성할 수 있습니다.

# 선
pygame.draw.line(surface, color, start_point, end_point, width)
pygame.draw.lines(surface, color, closed, pointlist, width)

# 면
pygame.draw.polygon(surface, color, pointlist, width)

# 원
pygame.draw.circle(surface, color, center_point, radius, width)

# 타원
pygame.draw.ellipse(surface, color, bounding_rectangle, width)

# 직사각형
pygame.draw.rect(surface, color, rectangle_tuple, width)
#rectangle_tuple은 (사각형시작x좌표,사각형시작y좌표,가로길이,세로길이) 의 튜플로 이루어져 있음

간단하게 동그라미, 세모(선3개이용), 직사각형, 타원의 4가지 도형을 그려보겠습니다.

#도형 예제
pygame.draw.circle(GameDisplay,BLACK,(100,50),30)

pygame.draw.line(GameDisplay,BLUE,(200,20),(180,60))
pygame.draw.line(GameDisplay,BLUE,(200,20),(220,60))
pygame.draw.line(GameDisplay,BLUE,(180,60),(220,60))

pygame.draw.rect(GameDisplay,RED,(300,20,50,50),2)

pygame.draw.ellipse(GameDisplay,GREEN,(400,20,80,50),2)

 

4. 게임 루프 설정

마지막으로 게임 윈도우가 열리고 시작될 동작을 게임 루프로 설정해 실행해 주면 됩니다.

현재는 이벤트가 설정된 함수가 따로 있지는 않습니다.

게임을 종료하고 싶을 때는

pygame.quit()을 사용해 종료해 줍니다.

##Game loop 설정: 게임이 진행되는 동안 실행되는 이벤트(함수)들 만들기##

# 게임을 종료시키는 함수
while True:
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    FramePerSec.tick(FPS)

 

전체 코드
import sys
import pygame
from pygame.locals import *

## pygame 기능 사용을 시작하는 명령어 ##
pygame.init()

## 초당 프레임 단위 설정 ##
FPS = 30
FramePerSec = pygame.time.Clock()

## 컬러 세팅 ##
BLUE = (0,0,255)
RED = (255,0,0)
GREEN = (0,255,0)
BLACK = (0,0,0)
WHITE = (255,255,255)

## 게임 창 설정 ##
GameDisplay = pygame.display.set_mode((640,440))
GameDisplay.fill(WHITE) #하얀색으로 배경 채우기
pygame.display.set_caption("PYGAME Example") # 창 이름 설정

## 선(line) 및 도형 그리기 ##
# 파라미터 설명
# pygame.draw.shape(surface, color, pointlist(centerpoint), width)
# surface: 어느 게임 창에 위치시킬 것인지 설정
# color: 오브젝트 색상 설정
# pointlist: 튜플형식으로 각 포인트(각)의 좌표를 설정
# start_point, end_point, centerpoint: 시작 좌표, 끝점, 가운데 좌표
# width: 도형 테두리 굵기 지정
"""
# 선
pygame.draw.line(surface, color, start_point, end_point, width)
pygame.draw.lines(surface, color, closed, pointlist, width)

# 면
pygame.draw.polygon(surface, color, pointlist, width)

# 원
pygame.draw.circle(surface, color, center_point, radius, width)

# 타원
pygame.draw.ellipse(surface, color, bounding_rectangle, width)

# 직사각형
pygame.draw.rect(surface, color, rectangle_tuple, width)
#rectangle_tuple은 (사각형시작x좌표,사각형시작y좌표,가로길이,세로길이) 의 튜플로 이루어져 있음
"""
#도형 예제
pygame.draw.circle(GameDisplay,BLACK,(100,50),30)

pygame.draw.line(GameDisplay,BLUE,(200,20),(180,60))
pygame.draw.line(GameDisplay,BLUE,(200,20),(220,60))
pygame.draw.line(GameDisplay,BLUE,(180,60),(220,60))

pygame.draw.rect(GameDisplay,RED,(300,20,50,50),2)

pygame.draw.ellipse(GameDisplay,GREEN,(400,20,80,50),2)



##Game loop 설정: 게임이 진행되는 동안 실행되는 이벤트(함수)들 만들기##

# 게임을 종료시키는 함수
while True:
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    FramePerSec.tick(FPS)

 

참고자료

파이게임 공식 홈페이지

 

A Newbie Guide to pygame — pygame v2.1.1 documentation

or How I learned to stop worrying and love the blit. Pygame is a python wrapper for SDL, written by Pete Shinners. What this means is that, using pygame, you can write games or other multimedia applications in Python that will run unaltered on any of SDL's

www.pygame.org

 

미리보기

다음에 만들어볼 미니게임 미리보기 입니다ㅎㅎ

반응형
반응형

오늘 포스팅은

python으로 SQL문을 작성하여  sqlite3 데이터베이스(DB)를 다루는 방법을 간단하게 알아보도록 하겠습니다.

sqllite3는 파이썬에 기본 내장되어 있기때문에 바로 불러와서 사용하면 됩니다.

 

샘플 DB 준비

이번에 사용할 샘플 DB를 다운받겠습니다.

SQLite에서 제공하는 샘플데이터를 사용해 보도록 하겠습니다.

아래의 링크를 통해 데이터를 다운받아 주세요.

https://www.sqlitetutorial.net/sqlite-sample-database/

 

SQLite Sample Database And Its Diagram (in PDF format)

You can download a SQLite sample database and its diagram to practice with SQLite. You will also learn how to connect to the database using sqlite3 tool

www.sqlitetutorial.net

위의 링크 접속 후 스크롤을 좀 내려서 하이라이트 표시해 놓은 부분을 클릭하면 다운 받을 수 있습니다.

압축을 풀고 db파일을 준비해 주세요.

샘플 db의 구조는 아래의 사진과 같이 구성되어 있습니다.

출처: https://www.sqlitetutorial.net/wp-content/uploads/2018/03/sqlite-sample-database-diagram-color.pdf

 

Python에서 SQLite3 사용하기

파이썬에서 sqlite3를 사용하여 db를 조작하는 방법은 크게 6단계로 나뉩니다.

1. sqlite3 모듈 import

2. 데이터베이스 파일 불러오기(connect)

3. 커서(cursor: 명령어를 db에 전달하여 정보를 가져오는 역할) 생성(cursor)

4. SQL 명령어 작성(CREATE, INSERT, SELECT, DELETE 등등)

5. SQL 명령어 실행(execute, cexutemany)

6. 데이터 베이스 닫기(close)

 

SQL 명령어 - 테이블 생성(CREATE)

CREATE는 테이블을 만드는 명령어 입니다.

불러온 DB에 Item이라는 테이블이 존재하지 않으면(NOT EXISTS) Item 테이블을 생성합니다.

Item 테이블에는 id, code, artist, price 4개의 컬럼이 있습니다.

id는 기본 키로 설정하여 식별이 가능하게 하고 자동으로 숫자가 부여되도록 설정하겠습니다.

나머지 컬럼은 빈 값(null)이 없도록 not null 설정을 해줍니다.

그후 select문을 이용해서 위에서 생성한 테이블이 제대로 만들어졌는지 확인해 줍니다.

## create table################################################

# 1.모듈 import
import sqlite3

# 2.DB파일 열기
conn = sqlite3.connect('chinook.db')

# 3. cursor(커서) 생성
cursor = conn.cursor()
###############################################################

# 4. SQL 명령어 작성
CREATE_SQL = """
    CREATE TABLE IF NOT EXISTS Item(
        id integer primary key autoincrement,
        code text not null,
        artist text not null,
        price integer not null
    );"""


# 5. SQL 명령 실행
cursor.execute(CREATE_SQL)

# 잘 실행되었는지 Item Table 출력하여 확인
cursor.execute('SELECT * FROM sqlite_master WHERE type="table" AND name="Item";')
table_list = cursor.fetchall()
for i in table_list:
    for j in i:
        print(j)

# 6. DB 닫기
conn.close()

그럼 터미널 창에 각 컬럼에 설정한 내용이 각각 잘 지정되어 Item 테이블이 생성된 것을 확인할 수 있습니다.

 

SQL 명령어 - 테이블에 정보 입력하기(INSERT)

Item이라는 테이블이 생성 되었지만 아직 아무 내용이 없는 빈 테이블 입니다.

그래서 테이블에 들어갈 정보를 INSERT문을 사용하여 몇 가지 입력해 줍니다.

INSERT INTO 테이블이름(컬럼1, 컬럼2, 컬럼3...) VALUES(?,?,?);

이렇게 위의 SQL 명령을 입력하면 이후 명령어 실행시 간편하게 내용 입력이 가능합니다.

여러 개의 정보를 한꺼번에 입력하고 싶으면 executemany()를 사용하여 다수의 정보를 테이블에 입력할 수 있습니다.

그리고 INSERT, UPDATE, DELETE 등을 사용할 때 

commit()을 꼭 실행하여 DB에 반영이 될 수 있도록 해야 합니다.

################################################################
## insert
# insert sql 작성
INSERT_SQL = 'INSERT INTO Item(code,artist,price) VALUES (?,?,?);'
## 데이터 여러개 한번에 추가하기
data = (
    ('ABC111','마룬5', 35000),
    ('DFG222','아리아나그란데', 45000),
    ('HIJ333','NCT', 30000)
)
# insert로 값 추가

# 여러개 값 추가
cursor.executemany(INSERT_SQL,data)
# 한개의 값만 추가
#cursor.execute(INSERT_SQL, ('KLM444','아이유', 38000))
# 커밋(insertm update delete 는 commit을 꼭 해주어야 데이터베이스에 반영 된다.)
conn.commit()
# 데이터 확인
cursor.execute('SELECT * FROM Item;')
item_list = cursor.fetchall()
for i in item_list:
    print(i)

# 닫기
conn.close()

내용이 잘 들어갔음을 확인할 수 있습니다.

SQL 명령어 - 테이블에 있는 정보 가져오기(SELECT)

이제 테이블에 있는 정보를 SELECT를 사용하여 불러오도록 하겠습니다.

customer라는 고객 테이블의 모든 정보를 가져오려면

SELECT * FROM customers;

이렇게 입력을 합니다. 그 후 정보를 가져올 때 fetchall()을 사용하여 불러와 주고 

이 내용을 for문을 써서 한 행의 정보를 하나씩 출력하여 깔끔하게 볼 수 있도록 합니다.

여기서는 LIMIT 을 사용하여 customer 10명의 정보만 불러와 보겠습니다.

################################################################
##select

SELECT_SQL = 'SELECT * FROM customers LIMIT 10;' #Where Country = "Austria";'#특정 국적의 사람만 정보 가져오기

#select로 선택된 행들 가져와서 출력하기
cursor.execute(SELECT_SQL)
rows = cursor.fetchall()
for row in rows:
    print(row)

conn.close()

만약 특정 국적의 고객 정보만 불러오고 싶으면 아래와 같이 WHERE을 사용하여 SQL을 작성해 줍니다.

SELECT * FROM customers Where Country = "Austria";

 

SQL 명령어 - 기존 정보 업데이트하기(UPDATE)

이번에는 기존에 존재하는 정보가 바뀌었을 때 변경하는 방법을 알아보도록 하겠습니다.

예를 들어, 직원 테이블 employees를 확인해 봅시다.

8 명의 직원 중 Jane이라는 직원이 IT 매니져로 직책이 바뀌었다고 했을 때,

직원 테이블에서는 이 직원의 정보를 기존의 Sales Support Agent에서 IT MAnager로 업데이트 하여야 합니다.

이 때, UPDATE와 SET, WHERE을 사용하여 직원 정보를 업데이트 할 수 있습니다.

또한 여기서도 commit()을 꼭 실행하여 반영이 완료되도록 해줍니다.

################################################################
##update

UPDATE_SQL = 'UPDATE employees set Title = "IT Manager" WHERE FirstName="Jane";'
cursor.execute(UPDATE_SQL)

conn.commit()
# 확인
cursor.execute('SELECT * FROM employees WHERE FirstName="Jane";')
employee = cursor.fetchall()
print(employee)
# db닫기
conn.close()

 

SQL 명령어 - 테이블 정보 삭제하기(DELETE)

이번에는 테이블에 있는 내용을 삭제해 보겠습니다.

처음에 생성했던 Item에서 마룬5의 정보를 삭제한다고 할 때 

DELETE를 사용하여 삭제가 가능합니다.

commit()도 실행하여 반영이 될 수 있도록 해 줍니다.

###############################################################
##delete

DELETE_SQL = 'DELETE FROM Item WHERE artist="마룬5";'
cursor.execute(DELETE_SQL)

conn.commit()
# 확인
cursor.execute('SELECT * FROM Item;')
rows = cursor.fetchall()
for row in rows:
    print(row)

conn.close()

 

전체 코드
## create table################################################

# 1.모듈 import
import sqlite3

# 2.DB파일 열기
conn = sqlite3.connect('chinook.db')

# 3. cursor(커서) 생성
cursor = conn.cursor()
###############################################################

# 4. SQL 명령어 작성
CREATE_SQL = """
    CREATE TABLE IF NOT EXISTS Item(
        id integer primary key autoincrement,
        code text not null,
        artist text not null,
        price integer not null
    );"""


# 5. SQL 명령 실행
cursor.execute(CREATE_SQL)

# 잘 실행되었는지 Item Table 출력하여 확인
cursor.execute('SELECT * FROM sqlite_master WHERE type="table" AND name="Item";')
table_list = cursor.fetchall()
for i in table_list:
    for j in i:
        print(j)

# 6. DB 닫기
conn.close()

################################################################
## insert
# insert sql 작성
INSERT_SQL = 'INSERT INTO Item(code,artist,price) VALUES (?,?,?);'
## 데이터 여러개 한번에 추가하기
data = (
    ('ABC111','마룬5', 35000),
    ('DFG222','아리아나그란데', 45000),
    ('HIJ333','NCT', 30000)
)
# insert로 값 추가

# 여러개 값 추가
cursor.executemany(INSERT_SQL,data)
# 한개의 값만 추가
cursor.execute(INSERT_SQL, ('KLM444','아이유', 38000))
# 커밋(insertm update delete 는 commit을 꼭 해주어야 데이터베이스에 반영 된다.)
conn.commit()
# 데이터 확인
cursor.execute('SELECT * FROM Item;')
item_list = cursor.fetchall()
for i in item_list:
    print(i)

# 닫기
conn.close()
################################################################
##select

SELECT_SQL = 'SELECT * FROM customers;' #LIMIT 10; #Where Country = "Austria";'

#select로 선택된 행들 가져와서 출력하기
cursor.execute(SELECT_SQL)
rows = cursor.fetchall()
for row in rows:
    print(row)

conn.close()
################################################################
##update

UPDATE_SQL = 'UPDATE employees set Title = "IT Manager" WHERE FirstName="Jane";'
cursor.execute(UPDATE_SQL)

conn.commit()
# 확인
cursor.execute('SELECT * FROM employees WHERE FirstName="Jane";')
employee = cursor.fetchall()
print(employee)
# db닫기
conn.close()

###############################################################
##delete

DELETE_SQL = 'DELETE FROM Item WHERE artist="마룬5";'
cursor.execute(DELETE_SQL)

conn.commit()
# 확인
cursor.execute('SELECT * FROM Item;')
rows = cursor.fetchall()
for row in rows:
    print(row)

conn.close()

 

코드 파일

sqlite3_ex.py
0.00MB

참고 자료

https://www.sqlitetutorial.net/

 

SQLite Tutorial - An Easy Way to Master SQLite Fast

This SQLite tutorial teaches you everything you need to know to start using SQLite effectively. You will learn SQLite via extensive hands-on practices.

www.sqlitetutorial.net

 

마무리

오늘 간단하게 파이썬으로 SQL작성하는 방법을 알아보았습니다 ㅎㅎ

항상 포스팅 잘 봐주셔서 감사합니다! 이번주도 좋은 한 주 되세요~

반응형
반응형

안녕하세요!

오늘은 tkinkter를 이용하여 python으로 GUI를 구현해 보도록 하겠습니다 ㅎㅎ

먼저, GUI가 무엇인지 알아보도록 하겠습니다.

GUI란?

GUI는 Graphic User Interface로, 사용자 그래픽 인터페이스를 말합니다.

GUI는 컴퓨터 사용시에 유저가 그래픽을 이용하여 상호작용할 수 있도록 도와줍니다.

보통 우리가 컴퓨터로 환경설정을 할 때 뜨는 창, 버튼 등등을 GUI라고 할 수 있습니다.

이런 UI를 사용하면 사용자 입장에서 더 쉽고 직관적으로 컴퓨터를 조작할 수 있습니다.

파이썬에서도 UI를 만들 수 있는데요, tkinter(티케이인터)라는 모듈로 구현이 가능합니다.

 

Tkinter란?

tkinter는 python에서 많이 사용하는 GUI모듈입니다.

tkinter는 파이썬에 기본으로 내장되어 있어 따로 설치할 필요 없이 바로 사용이 가능합니다.

창을 생성하고, 버튼, 레이블(텍스트) 등의 위젯을 사용하여 프로그램 제작도 할 수 있습니다.

Tkinter를 사용하면 기본적인 UI + 기능 함수를 실행해 프로그램을 만듭니다.

Tkinter로 프로그램 생성시 크게 4단계로 진행이 됩니다.

1. 화면 생성

2. 화면 안에 위치할 UI 및 이벤트함수 생성 및 구성

3. UI 배치

4. 메인루프 실행

 

예제1: label(레이블) 만들기

그럼 기초예제로 창을 띄워 Hello World!라는 레이블을 출력하는 프로그램을 만들어 보겠습니다.

from tkinter import *


#  예제 1) tkinter 파이썬 GUI 레이블(label)
# tkinter를 사용하여 텍스트를 나타내보자

# 1. 루트화면 (root window) 생성
tk = Tk() 
# 2. 텍스트 표시
label = Label(tk,text='Hello World!') 
# 3. 레이블 배치 실행
label.pack()
# 4. 메인루프 실행
tk.mainloop()

 

위의 코드를 실행하면 사진과 같이 Hello World!가 창에 출력 됩니다.

 

예제2: button(버튼) 만들기

이번에는 Button()을 사용해 버튼을 만들어 보도록 하겠습니다.

그리고 버튼을 누르면 그 버튼의 텍스트가 바뀌는 함수를 추가해 주도록 하겠습니다.

# 예제2) 버튼만들기
tk = Tk()
# 함수 정의 (버튼을 누르면 텍스트 내용이 바뀜)
def event():
    button['text'] = '버튼 누름!'

button = Button(tk,text='버튼입니다. 누르면 함수가 실행됩니다.',command=event)
button2 = Button(tk,text='버튼2 입니다.')
button.pack(side=LEFT,padx=10,pady=10) #side로 배치설정, padx로 좌우 여백설정, pady로 상하 여백설정 
button2.pack(side=LEFT, padx=10, pady= 10)
tk.mainloop()

기본 화면
버튼 클릭 후 동작 화면

pack()을 사용하여 버튼의 위치 및 여백 등을 설정할 수 있습니다.

또한 해당 button의 command 속성에 미리 만든 함수를 넣으면 클릭 시 해당 함수가 동작 합니다.

버튼의 텍스트를 바꾸고 싶을 때는 text속성에 접근하여 수정하면 반영이 됩니다.

#버튼 텍스트 수정(text속성에 접근하여 수정)
button['text'] = 'Button1'
button2['text'] = 'Button2'                        
tk.mainloop()

 

예제3: 버튼 Counter 만들기

이번에는 버튼을 누르면 누른 횟수가 label로 표기되고 reset하여 지금까지 클릭한 횟수를 초기화하는 코드를 작성해 보겠습니다.

함수는 2가지를 만들어 사용할 예정인데,

1. 버튼을 누를 때마다 카운트를 세는 함수

2. 버튼을 누르면 카운트가 초기화되는 함수

위의 두 가지 함수를 각각 카운트버튼, 초기화 버튼에 할당하여 프로그램을 만들어보겠습니다.

tk.title()을 사용하여 창의 이름을 설정할 수 있고,

라벨 및 버튼의 속성 (fg, bg, width, font) 들로 글자 색, 배경색, 너비, 폰트크기 등을 지정할 수 있습니다.

# 예제 3) 버튼 클릭시 실행될 이벤트(함수) 설정
tk = Tk()

# 다른 함수 정의(버튼 누를때마다 카운트를 세는 함수)
counter = 0
def clicked():
    global counter #전역변수 counter
    counter += 1
    label1['text'] = '버튼 클릭 수: ' + str(counter)

# 리셋 함수(카운트 초기화)
def reset():
    global counter
    counter = 0
    label1['text'] = '옆에 버튼이 있습니다.'
## GUI 구성(텍스트,버튼) ##

# 창 이름 설정
tk.title('GUI예제') 

# 텍스트
label1=Label(tk, text='옆에 버튼이 있습니다.',fg='blue',font=20) # fg는 글자 색 지정, font로 글자 설정
label1.pack(side=LEFT, padx=10, pady=10)
# 버튼1
button3 = Button(tk,text='클릭해 보세요.',bg='green',font=15,width=30,height=5,command= clicked) #command로 버튼 클릭 시 동작할 함수 지정, bg로 색상지정, width,height로 각각 넓이 높이 지정
button3.pack(side=LEFT, padx=10, pady=10)
# 버튼2
button4 = Button(tk,text='reset',bg='red',width=30,height=5,font=15,command=reset)
button4.pack(side=LEFT,padx=10, pady=10)
tk.mainloop()

기본화면
초록 버튼을 눌렀을 때(카운팅)
빨강 버튼을 눌렀을 때(초기화)

위와 같이 각각의 버튼이 잘 실행됨을 확인할 수 있습니다.

 

예제4: 길이 단위 변환기(ft, cm)

마지막 예제로, 입력값을 받아 각각 ft와 cm로 변환할 수 있는 프로그램을 만들어 보겠습니다.

함수는 각각

1. ft를 cm로 변환하는 함수

2. cm를 ft로 변환하는 함수

이렇게 2가지를 사용하여 entry를 사용해 사용자로부터 입력값을 받아 변환하는 UI를 만들어 줍니다.

함수를 만들때 1ft(피트) = 30.48cm 임을 참고하여 코드를 작성합니다.

entry는 input함수처럼 유저로부터 값을 입력받을 수 있는 tkinter 함수 입니다.

insert()를 사용하여 입력창에 글자를 입력할 수 있고,

get()을 사용하여 입력 내용을 가져올 수 있으며,

delete()를 사용하면 입력창 내용 삭제가 가능합니다.

.grid()는 pack처럼 버튼, 레이블 등의 위젯을 위치시켜 주는 역할을 합니다.

행(row)과 열(column)으로 위젯의 위치를 지정하여 줍니다.

###예제4) ft -> cm로 바꾸는 단위 변환기 만들기
# Entry: input과 비슷한 역할 (사용자가 입력한 내용 전달)
# get: Entry를 사용한 입력 내용 가져올 수 있다.
# delete: 사용자 입력 삭제
# Frame: 컨테이너, 창 안에 프레임 생성
# grid: 격자 배치
tk = Tk()
tk.title('길이 변환기')
def Ft2Cm():
    ft2cm = entry1.get()
    entry2.delete(0,"end")
    entry2.insert(0,round(float(ft2cm)*30.48,4))
def Cm2Ft():
    cm2ft = entry2.get()
    entry1.delete(0,"end")
    entry1.insert(0,round(float(cm2ft)/30.48,4))

label1 = Label(tk,text='피트(ft)').grid(row=0, column=0)
label2 = Label(tk,text='센티미터(cm)').grid(row=1,column=0)

# 각 단위 입력받는 부분 만들기
entry1 = Entry(tk)
entry2 = Entry(tk)


entry1.grid(row=0,column=1)
entry2.grid(row=1,column=1)

btn1 = Button(tk,text='ft->cm',bg='black',fg='white',command=Ft2Cm).grid(row=2,column=0)
btn2 = Button(tk,text='cm->ft',bg='black',fg='white',command=Cm2Ft).grid(row=2,column=1)

tk.mainloop()

ft를 cm로 변환했을 때
cm를 ft로 변환했을 때

이렇게 각각 필요한 단위로 변환할 수 있습니다.

 

 전체 코드
from tkinter import *


#  예제 1) tkinter 파이썬 GUI 레이블(label)
# tkinter를 사용하여 텍스트를 나타내보자

# 1. 루트화면 (root window) 생성
tk = Tk() 
# 2. 텍스트 표시
label = Label(tk,text='Hello World!') 
# 3. 레이블 배치 실행
label.pack()
# 4. 메인루프 실행
tk.mainloop()

# 예제2) 버튼만들기
tk = Tk()
# 함수 정의 (버튼을 누르면 텍스트 내용이 바뀜)
def event():
    button['text'] = '버튼 누름!'

button = Button(tk,text='버튼입니다. 누르면 함수가 실행됩니다.',command=event)
button2 = Button(tk,text='버튼2 입니다.')
button.pack(side=LEFT,padx=10,pady=10) #side로 배치설정, padx로 좌우 여백설정, pady로 상하 여백설정 
button2.pack(side=LEFT, padx=10, pady= 10)
#tk.mainloop()

#버튼 텍스트 수정(text속성에 접근하여 수정)
button['text'] = 'Button1'
button2['text'] = 'Button2'                        
tk.mainloop()

# 예제 3) 버튼 클릭시 실행될 이벤트(함수) 설정
tk = Tk()

# 다른 함수 정의(버튼 누를때마다 카운트를 세는 함수)
counter = 0
def clicked():
    global counter #전역변수 counter
    counter += 1
    label1['text'] = '버튼 클릭 수: ' + str(counter)

# 리셋 함수(카운트 초기화)
def reset():
    global counter
    counter = 0
    label1['text'] = '옆에 버튼이 있습니다.'
## GUI 구성(텍스트,버튼) ##

# 창 이름 설정
tk.title('GUI예제') 

# 텍스트
label1=Label(tk, text='옆에 버튼이 있습니다.',fg='blue',font=20) # fg는 글자 색 지정, font로 글자 설정
label1.pack(side=LEFT, padx=10, pady=10)
# 버튼1
button3 = Button(tk,text='클릭해 보세요.',bg='green',font=15,width=30,height=5,command= clicked) #command로 버튼 클릭 시 동작할 함수 지정, bg로 색상지정, width,height로 각각 넓이 높이 지정
button3.pack(side=LEFT, padx=10, pady=10)
# 버튼2
button4 = Button(tk,text='reset',bg='red',width=30,height=5,font=15,command=reset)
button4.pack(side=LEFT,padx=10, pady=10)
tk.mainloop()



###예제4) ft -> cm로 바꾸는 단위 변환기 만들기
# Entry: input과 비슷한 역할 (사용자가 입력한 내용 전달)
# get: Entry를 사용한 입력 내용 가져올 수 있다.
# delete: 사용자 입력 삭제
# Frame: 컨테이너, 창 안에 프레임 생성
# grid: 격자 배치
tk = Tk()
tk.title('길이 변환기')
def Ft2Cm():
    ft2cm = entry1.get()
    entry2.delete(0,"end")
    entry2.insert(0,round(float(ft2cm)*30.48,4))
def Cm2Ft():
    cm2ft = entry2.get()
    entry1.delete(0,"end")
    entry1.insert(0,round(float(cm2ft)/30.48,4))

label1 = Label(tk,text='피트(ft)').grid(row=0, column=0)
label2 = Label(tk,text='센티미터(cm)').grid(row=1,column=0)

# 각 단위 입력받는 부분 만들기
entry1 = Entry(tk)
entry2 = Entry(tk)


entry1.grid(row=0,column=1)
entry2.grid(row=1,column=1)

btn1 = Button(tk,text='ft->cm',bg='black',fg='white',command=Ft2Cm).grid(row=2,column=0)
btn2 = Button(tk,text='cm->ft',bg='black',fg='white',command=Cm2Ft).grid(row=2,column=1)

tk.mainloop()
코드 파일

pythonGUI_ex.py
0.00MB

 

마무리

이렇게 간단하게 파이썬으로 GUI를 만들어 보았습니다.

단위 변환도 쉽게 만들어 사용할 수 있어서 재밌네요 :-)

개인적으로 예전에 대학 교양수업에서 배웠던 비주얼 베이직이 생각나네요 ㅎㅎ

tkinter로 만들어 보고 싶은 다른 프로그램이 있다면 댓글 남겨주세요!

반응형

+ Recent posts