IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

ゼロから歩くPythonの道

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第33回 円を動かすためのメソッドを書いてみよう (菱沼佑香) 2022年6月

こんにちは、吉政創成 菱沼です。

今回も「いちばんやさしいPython入門教室(大澤 文孝氏著) 」を片手に勉強していきます。

「クラス」と「オブジェクト」の概念を学ぶということで、その準備段階として、tkinterのcanvas上に動く円を作る方法について学びつつ、クラスとは何か、オブジェクトは何かをざっくり学習してきました。

前回からは実際にオブジェクト指向を使った動く円を作るために、まずは円の設計図となるクラスの書き方を学び、そこで使用した特殊メソッドについてまとめてみました。

今回は実際に動かすために必要なメソッドについて学習してみたいと思います。

前回のふりかえり:クラスと、その書き方

クラス(Class)は作りたいものの設計図(ひな形)となるもので、実体化(インスタンス化)させたものをインスタンスと呼びます。

下図は今回作りたい動く円の設計図(x座標:x、y座標:y、移動量:dx・dy、色:color)となる部分を初期化する特殊メソッド[__init__]を使用してクラスで記述したものです。

実際に実行すると右側に書かれているような値が代入され、インスタンス化されていきます。

fig01

ただこれだけでは円は動かないので、動かすためのメソッドをdef関数で記述することになります。

ちなみにメソッドはクラス内に書かれることもあれば、外に書かれることもあるようですが、今回はクラスの中に書いていくようです。

クラスができたらメソッドを書いて円を動かそう

ではまずはテキストから引用です。

引用-----

P.217

このオブジェクトに、命令を与えることができる「メソッド(method)」を作っていきましょう。最終的には、「円を動かす」というメソッドを実装することになりますが、初めからそれは難しいので、簡単なtestというメソッドを実装していくことにします。

メソッドというのは、クラスの内部で定義された関数にすぎません。例えば、次のようにtestメソッドを記述します。

fig02

-------

コードの間に入っていた文章は省略しました。

ここで追加したtestという関数では、xとyに入れられた値を表示するというものになり、「b=~」の部分が実行すると参照される値の部分になります。

最後の行にある[b.test()]がメソッドを実行させるのに必要な部分で、これは[データ.メソッド名()]という書式で書かれるようです。

今回はデータの設定をしているのがbで、メソッド名がtestなので、[b.test()]ですね。

これによってプログラムを走らせると、変数bで設定されたデータから、xには400が、yには300が代入され、下図のように結果が表示されることになります。

(結果の画面ではわかりやすいようにどちらがxでyかを表示させるように変更しています。)

fig03

さて続いて円を動かすためのメソッドに挑戦してみます。

def関数でメソッドを書いてみる

円を動かす部分(タイマーを含めた)メソッドは次のように書かれるようです。

fig04

(※この時点では円は一つだけしか作っていません。)

さてここでオブジェクト指向の学習を始める前に作成したプログラムから動かすために作った部分を振り返ってみます。それがこちら。動かす部分だけを抜き取ってきました。

fig05

この時はリストとディクショナリを使っており、変数bに代入される値もリストから参照するために[“x”]というような記述になっていましたが、クラスによって書かれるようになったことで、インスタンス変数(self.~)で書かれるように変更されました。

また、タイマーの部分にも変化があります。ここからテキスト引用です。

-----

P.219

定期的にタイマーで起動するloop関数を次のように定義しました。

fig06

0.01秒(10ミリ秒)後に、このloop関数が実行されるよう、次のようにしてタイマー登録しています。

root.after(10, loop)

上記のloop関数では、

b.move(canvas)

というように、変数bが指しているBallオブジェクトのmoveメソッドを実行しています。

------

新たにloop関数を設置して、move関数の実行とタイマーをまとめているようです。

という事で…ここからはmoveメソッドに書かれている内容の説明がされています。また引用です。

-----

P.219

moveメソッドは、次のように定義しています。

def move(self, canvas):

最初の引数は、このオブジェクトを示すということは、すでに説明しました。2番目の引数は、実行されるときに渡した値(ここではb.move(canvas))としてmoveメソッドを実行しているので、この時に渡したcanvas)です。

------

まず、このプログラムでは、「①円を作り、②作った円を消して、③次の場所に円を作り、④また作った円を消して…」を繰り返すという方法で円が動いているように見せるという作りになっており、これがmoveメソッドで定義された動きという事になります。

この仕組みはリストで書かれていた時と変わりませんが、クラスで書かれるようになったため、[b[“x”]]とリストの書式で書かれていた部分は[self.x]というように該当する箇所すべてを書き換えてあげます。

ちょっとすっきりした印象ですよね。

そのあと、メソッドを実行するための呪文[b.move(canvas)]を書けばメソッド部分は完成のようです。

コードの全体は次の画像でご確認ください。

fig07

これを実行すると次の画像のように動きます。

fig08gif

円を増やすにはリストを使う

増やすには複数のデータを持たせたリストを作り、変数bがそのリストを参照するように変更してあげればいいようです。

ということで、一部分をこんな感じで変更しました。

fig09

一つ分の円の部分は要らないので、コメントアウトして、ballsというリストを作っています。

さらに[b.move(canvas)]の前に、変数bがballsリストを参照するように、[for b in balls:]を追加してあげればOKです。

実際に動かしたのがこちら。

fig10gif

という事で、今回はこちらで終了です。お付き合いいただきありがとうございました

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes