円の表示
- 動かない円から始める
ウィンドウは6章でやったことと同様にする。
[https://qiita.com/5-D/private/13de5349e0b969a57df0]
canvas.create_oval(300 - 20, 200 - 20, 300 + 20, 200 + 20)
このコードの意味は一度見ただけではさっぱりだろう。
これは、中心(300,200) 半径20 の円をあらわしている。
いわれてみると、数学で似たように円を式で表していたことを思い出した。
- クリックと円を連動させる
まず、連動させるにはbindメゾットというもので実行したい関数を結びつける必要がある。
canvas.bind("<Button-1>", click)
この"Button-1" はイベント名を表していて"click"は関数を表している。
そして、"click"の関数を定めなければならない。
その方法は
def click(event):
canvas.create_oval(event.x - 20, event.y - 20, event.x + 20,
event.y + 20, fill="red" , width=0)
こうして"click"の関数を定める。
- 円を動かす
円を動かすということは中心をずらすことと考えられる。
このようにすることで円の中心を一定時間ごとに中心を動かすことが出来る。
root.after(時間, 実行したい関数)
で一定時間ごとに関数を実行できる。
円の表示(応用編)
- 斜め移動と反射
斜め移動させるには上記で移動させたようにx座標だけではなくy座標も考慮しなければならない。また、反射はキャンバスの端で正負がいれかわるような変数を用意しなければならない。
x = x + dx
if x >= canvas.winfo_width():
dx = -1
if x <= 0:
dx = 1
このように変数dxを用意しこの変数を用いてxの座標を定めることで円をキャンバスの端で反射させることができる。
斜めに動かすには同じことをyについてもやればよい。ただし、xではwidthであったところがyではheightになることに注意せねばならない。
- 複数の円を動かすとき
ひとつひとつの円に対してプログラムを組みひとつずつ処理していく方法もあるが、オブジェクトというものを使うことによってより簡潔にしていくことができる。
しかし、プログラマはオブジェクトをつくるのではありません。オブジェクトの元となるクラスというものを作るものだ。
class Ball:
def__init__(self, x, y, dx, dy, color):
self.x = x
self.y = y
self.dx = dx
self.dy = dy
self.color = color
これがクラスの作り方だ。
Ballはクラス名であり、自分でわかりやすいものに決定できる。
initというのがこのクラスの中核であり、コンストラクタと呼ばれている。
これを利用することで、プログラムが一つの命令をするだけで複数の円を動かすことが出来る。
- 円以外の図形
円以外の図形を動かすのも、描画するところ以外は円と変わりはない。
それでは、描画の違いをみていく。
class Rectangle(Ball):
def erase(self, canvas):
canvas.create_rectangle(self.x - 20, ........)
def draw(self, canvas):
canvas.create_rectangle(self.x - 20, ........)
これが四角形の描画のほうほうである。
なにをしているのかというと、元ある円のクラスを利用して、Ballの部分をRectangleと書き換えることで四角形を描画する。もちろん三角形も同様にでき、BallをTriangleに書き換えることで描画できる。
以上のことを組み合わせることで円、四角形、三角形を斜めにかキャンバスの端で反射させることができる。
問題点
example07-07-01だけがpythonが応答しませんとなり円が動かない
プログラムにエラーもなく見直しても誤りがないので原因がわからない。
もう一度新しく作り直さなければならない。
考えられる原因として処理の多さによるサーバーダウンを考えた。
いちいち"white"として上書きして円を消すことが処理すべきタスクが増えている原因であると考える。