1. バインディング
まずはドラッグ可能図形を作ります。そのためにはTkinterのバインディングというものを勉強しなければなりませんでした。バインディングとは、簡単にいえばあるイベントに対してある関数を紐づけることだといえます。次のようなメソッド*1で表します。c0.tag_bind(id, 'event', function)
- <Button-1>:左クリックしたとき
- <Button1-Motion>:左クリックしながらドラッグしたとき
- <ButtonRelease-1>:左クリックして離したとき
c0.tag_bind(id, '<Button1-Motion>', move)
def move(event): x = event.x y = event.y if x > 0 and x < 300 and y > 0 and y < 280: c0.coords('current', x - 10,y - 10,x + 10,y + 10)
ここで、再描画する図形ですが、idでもいいのですがタグを使って指定しています。タグはいつでも自由につけられる図形の名前のようなもので、複数の図形を一気に操作したいときなどに便利です。'current'タグは Tkinter の定める特殊なタグで、マウスポインタのある位置の図形につくタグです。
マウスポインタについていく関数を図形にバインディングすることで、ドラッグ可能な図形を作ることができました。
2. ループ
次に、周期的に動く図形を作ります。さきほど、coords()というメソッドが登場しましたが、基本的に図形が動くときはこのcoords()を用います。今回はある円周軌道上を回る図形を作りたいので、三角関数で位置を計算して再描画を行えばいいですね。Tkinterでは、ループはafter()メソッドで作ります。root.after(10, func)
def draw_orbit(): x = 150 + r[i] * math.sin(math.radians(deg)) y = 140 - r[i] * math.cos(math.radians(deg)) c0.coords(id, x - 10, y - 10, x + 10, y + 10) if deg > 359: deg = 0 else: deg += 3.6 / rate deg = round(deg, 1) def show_orbit(): draw_orbit() root.after(10, show_orbit)
以上でTkinter でGUI音遊びソフト作り(1)に貼った動画のような画面を作るやり方は終わりです。意外と簡単なのでびっくりしました。次は音をどのように出すかを考えます。楽器作りでは Raspberry Pi 標準ソフトの Sonic Pi に音出しを頼っていましたが、今回はこの Orbit 単体で音を出したいので、Python 上で音を出すやり方を模索します(ググる)。
*1:前回までの記事でメソッドと関数の混同が見られます。まだ完全には理解できていませんが以降なるべく正しく使おうと思います。
0 件のコメント:
コメントを投稿