Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonのTkinter Canvasでボールをアニメーション表示する方法

Tkinterは、Pythonで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=Canvas(win, width=700, height=350)
canvas.pack()

# Canvas上にボール(楕円)を作成
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()

コードのポイント解説

  • canvas.create_oval():指定した座標(左上と右下)をもとに楕円形を描画します。fillオプションで塗りつぶし色を指定できます。

  • canvas.move():第1引数にオブジェクトID、第2・第3引数にX方向・Y方向の移動量を渡して図形を移動させます。

  • canvas.coords():オブジェクトの現在の座標(左・上・右・下)をタプルとして取得でき、壁との衝突判定に利用しています。

  • canvas.after():指定したミリ秒後に関数を再帰的に呼び出すことで、アニメーションを継続的に実行します。

実行結果

上記のコードを実行すると、700×350ピクセルのウィンドウが表示され、その中で緑色のボールがキャンバスの壁に跳ね返りながら動き続けます。速度を変更したい場合は、変数xspeedyspeedの値を調整してください。数値を大きくするとボールの移動が速くなります。

  1. TkinterのCanvas(キャンバス)をクリアする方法を解説

    Tkinterでは、ウィンドウ内にキャンバス(Canvas)を追加できます。キャンバスを作成すると、メモリ内部に描画データのためのストレージが確保されます。そのため、不要になったキャンバスの内容は、適切にクリアまたは削除してあげる必要があります。キャンバスをクリアするには、delete()メソッドを使用します。引数に「all」を指定することで、Tkinterフレーム上に存在するすべてのキャンバスアイテムを一括で削除し、画面をまっさらな状態に戻すことができます。サンプルコード# tkinterライブラリをインポート from tkinter import * # tkinterフレームのインス

  2. Python Tkinterでキャンバス上の画像を中央に配置する方法

    Tkinterを使ってGUIアプリケーションを開発している際、Tkinterのキャンバス(Canvas)上に画像を読み込みたいケースはよくあります。本記事では、その画像をキャンバスの中央に配置する方法を解説します。anchorパラメータとはデフォルトでは、キャンバスは画像を自身の幅と高さに従って配置します。しかし、anchor(アンカー)パラメータに方向の値を渡すことで、画像の位置を任意の方向(N:北、S:南、E:東、W:西、NS、EWなど)に操作できます。アンカーは画像関数と一緒に呼び出されるパラメータで、キャンバス内における画像の方向や位置を定義します。このanchorパラメータを活用すれ