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 함수를 다시 호출하는 재귀적 스케줄링 방식입니다. 이 값을 줄이면 애니메이션이 더 빨라지고, 늘리면 느려집니다.
실행 결과
위 코드를 실행하면 캔버스 안에서 초록색 공이 계속 움직이며 벽에 닿을 때마다 방향을 바꿔 튕기는 애니메이션 창이 나타납니다.