【Python】ルーレットアプリ開発 Part6
こんにちは、にわこまです。
今回は、ルーレットを徐々に止めるという処理を作成します。Stopボタンのクリック直後にルーレットが止まってしまうと、狙ってルーレットを止めることが出来てしまいます。そのようなことができないように徐々に止まるようにします。
誤字脱字など何かございましたらご連絡お願いします。
ルーレットアプリ開発の目次はこちら
スポンサードサーチ
徐々に止める処理の作成
現在は、10ミリ秒に10°回転させています。ここから徐々に止める処理を実現する方法は2パターンあります。
1パターン目は、「20ミリ秒に10°回転」のように回転する間隔を長くするという方法です。
2パターン目は、「10ミリ秒に5°回転」のように回転する角度を小さくするという方法です。
今回は、パターン1で実現します。
コードの提示
ルーレットを徐々に止める処理のソースコードを以下に示します。
import tkinter as tk
import numpy as np
class RouletteApp():
def __init__(self):
# 省略
def set_butttons(self):
# 省略
def set_circle(self):
# 省略
def set_triangle(self):
# 省略
def set_result_text(self):
# 省略
def rotate_fans(self):
# 省略
def check_roulette(self):
# 省略
def rotate_10ms(self):
# 省略
def rotate_ms(self, msec, cnt):
self.rotate_fans()
cnt -= 1
if(cnt <= 0):
self.root.after_cancel(self.after_id)
return
self.after_id = self.root.after(msec, self.rotate_ms, msec, cnt)
def clk_start(self):
# 省略
def clk_stop(self):
self.root.after_cancel(self.after_id)
cnt = np.random.randint(18, 36)
self.rotate_ms(100, cnt)
cnt = np.random.randint(12, 18)
self.rotate_ms(500, cnt)
self.check_roulette()
if __name__ == '__main__':
rouletteapp = RouletteApp()
rouletteapp.root.mainloop()
上記のコードは以下からダウンロードできます。
【Python】ルーレットアプリ開発 Part6 ソースコード01
コードの解説
31行目から37行目の「rotate_ms関数」は、任意のミリ秒間隔で10°回転させる関数です。
31行目の「msec」には、ミリ秒を代入します。
31行目の「cnt」には、関数の実行回数を代入します。
32行目の「self.rotate_fans()」は、ルーレットを10°回転させる関数を実行しています。
33行目の「cnt -= 1」は、関数の実行回数から1を引いています。
34行目の「if文」は、cntが0以下であることを判定しています。0以下であれば35行目と36行目を実行します。
35行目の「self.root.after_cancel(self.after_id)」は、after関数を止めています。つまり、ルーレットの回転を止めています。
36行目の「return」は、この関数を終了させるための処理です。37行目を実行しないようにするための処理です。
37行目の「self.after_id = self.root.after(msec, self.rotate_ms, msec, cnt)」は、after関数によって任意のミリ秒後にself.rotate_ms関数を実行するように設定しています。また、self.rotate_ms関数はミリ秒と実行回数の引数が必要なため、第3引数、第4引数に代入しています。
44行目の「cnt = np.random.randint(18, 36)」は、18から36の間でランダムに数字を取得し、変数に代入しています。18から36の間で実行回数を決めているため、180°以上360°以下の回転になるということです。
45行目の「self.rotate_ms(100, cnt)」は、先ほど説明したrotate_ms関数を実行しています。100ミリ秒間隔で10°回転するように設定しています。
46行目の「cnt = np.random.randint(12, 18)」は、12から18の間でランダムに数字を取得し、変数に代入しています。12から18の間で実行回数を決めているため、120°以上180°以下の回転になるということです。
47行目の「self.rotate_ms(500, cnt)」は、先ほど説明したrotate_ms関数を実行しています。500ミリ秒間隔で10°回転するように設定しています。
動作確認
コードを保存したら、コマンドプロンプトを開きファイルを保存したフォルダまで移動します。移動したら、以下のコマンドを入力し実行します。
python rouletteapp.py
Startボタンをクリックし、Stopボタンをクリックします。ルーレットが徐々に止まることを確認したら動作確認完了です。
スポンサードサーチ
結果テキスト表示遅延処理
先ほどの動作確認で気づいたかもしれませんが、結果テキストがルーレットが止まる前に表示されてしまっています。これでは、結果テキスト表示とルーレットが合わないため、ルーレットが止まった後に結果テキストを表示するようにします。
具体的には、after関数を使って結果テキストを表示する関数を回転が止まった後に実行するように設定します。
コードの提示
ルーレットが止まった後に結果テキストを表示させる処理のソースコードを以下に示します。
import tkinter as tk
import numpy as np
class RouletteApp():
def __init__(self):
# 省略
def set_butttons(self):
# 省略
def set_circle(self):
# 省略
def set_triangle(self):
# 省略
def set_result_text(self):
# 省略
def rotate_fans(self):
# 省略
def check_roulette(self):
# 省略
def rotate_10ms(self):
# 省略
def rotate_ms(self, msec, cnt):
# 省略
def clk_start(self):
# 省略
def clk_stop(self):
self.root.after_cancel(self.after_id)
cnt = np.random.randint(18, 36)
self.rotate_ms(100, cnt)
cnt = np.random.randint(12, 18)
self.rotate_ms(500, cnt)
wait_msec = 500 * cnt
self.root.after(wait_msec, self.check_roulette)
if __name__ == '__main__':
rouletteapp = RouletteApp()
rouletteapp.root.mainloop()
上記のコードは以下からダウンロードできます。
【Python】ルーレットアプリ開発 Part6 ソースコード02
コードの解説
43行目の「wait_msec = 500 * cnt」は、500×500ミリ秒間隔で10°回転させる関数の実行回数の結果を変数に代入しています。つまり、500ミリ秒間隔で回転している時間を算出しています。
44行目の「self.root.after(wait_msec, self.check_roulette)」は、先ほど算出したミリ秒後にself.check_roulette関数を実行するように設定しています。
動作確認
コードを保存したら、コマンドプロンプトを開きファイルを保存したフォルダまで移動します。移動したら、以下のコマンドを入力し実行します。
python rouletteapp.py
Startボタンをクリックし、Stopボタンをクリックします。ルーレットが止まった後に結果テキストが表示されることを確認できたら動作確認完了です。
スポンサードサーチ
まとめ
今回は、ルーレットアプリの応用編ということでルーレットを徐々に止める処理を作成しました。また、それに伴って結果テキストの表示タイミングを変更しました。
以上でルーレットアプリ開発は完了です。
ルーレットアプリ開発の目次はこちら
最後までお読みいただきありがとうございます。
スポンサードサーチ