Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 Tkinter Canvas로 공 이동 애니메이션 만들기

Tkinter는 파이썬에 기본 포함된 표준 라이브러리로, GUI 기반 애플리케이션을 손쉽게 만들 수 있도록 도와줍니다. 이번 글에서는 Canvas 위젯을 활용해 창 안에서 자유롭게 움직이는 공(애니메이션)을 구현하는 방법을 알아보겠습니다. Canvas 위젯은 이미지 추가, 도형 그리기, 오브젝트 애니메이션 등을 지원하기 때문에 간단한 게임이나 시각화 프로그램을 만들 때 매우 유용합니다.

구현 개요

움직이는 공 애플리케이션은 다음과 같은 요소들로 구성됩니다.

  • Canvas 위젯: 창 안에 타원형(공)을 그리기 위한 영역입니다.

  • move_ball() 함수: 공을 실제로 이동시키는 역할을 합니다. 함수 내부에서는 공이 캔버스 벽(왼쪽, 오른쪽, 위, 아래)에 닿았을 때 위치가 계속 갱신되도록 처리합니다.

  • canvas.after(duration, function): 일정 시간 간격으로 함수를 반복 호출하여 공의 위치를 주기적으로 업데이트합니다. 이 메서드 덕분에 부드러운 애니메이션 효과를 얻을 수 있습니다.

  • 메인 루프 실행: 마지막으로 코드를 실행하면 애플리케이션이 동작합니다.

예제 코드

# 필요한 라이브러리 임포트
from tkinter import *

# tkinter 프레임 또는 윈도우 인스턴스 생성
win = Tk()

# 윈도우 크기 설정
win.geometry("700x350")

# 윈도우 크기 고정
win.resizable(False, False)

# 캔버스 위젯 생성
canvas = Canvas(win, width=700, height=350)
canvas.pack()

# 캔버스 위젯에 타원(공) 생성
ball = canvas.create_oval(10, 10, 50, 50, fill="green3")

# 공 이동 속도 설정
xspeed = yspeed = 3

def move_ball():
    global xspeed, yspeed

    # 공을 현재 속도만큼 이동
    canvas.move(ball, xspeed, yspeed)
    (leftpos, toppos, rightpos, bottompos) = canvas.coords(ball)

    # 좌우 벽에 닿으면 x축 방향 반전
    if leftpos <= 0 or rightpos >= 700:
        xspeed = -xspeed

    # 상하 벽에 닿으면 y축 방향 반전
    if toppos <= 0 or bottompos >= 350:
        yspeed = -yspeed

    # 30밀리초 후 move_ball 함수 재호출
    canvas.after(30, move_ball)

canvas.after(30, move_ball)

win.mainloop()

코드 설명

create_oval() 메서드는 캔버스에 타원을 그리며, 네 개의 좌표 값(왼쪽 위 x, y와 오른쪽 아래 x, y)으로 위치와 크기를 결정합니다. fill="green3" 옵션으로 공의 색상을 초록색으로 지정했습니다.

canvas.move()는 지정한 객체를 x, y 방향으로 이동시키고, canvas.coords()는 현재 객체의 경계 좌표를 반환합니다. 반환된 좌표를 확인하여 공이 캔버스 가장자리에 도달하면 속도 값의 부호를 반전시킴으로써 벽에 튕겨 나오는 듯한 효과를 만듭니다.

canvas.after(30, move_ball)는 30밀리초마다 move_ball 함수를 다시 호출하는 재귀적 스케줄링 방식입니다. 이 값을 줄이면 애니메이션이 더 빨라지고, 늘리면 느려집니다.

실행 결과

위 코드를 실행하면 캔버스 안에서 초록색 공이 계속 움직이며 벽에 닿을 때마다 방향을 바꿔 튕기는 애니메이션 창이 나타납니다.