質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

1回答

1102閲覧

afterメソッドで、正確に「任意秒ごと」に動作させたい。

ppap

総合スコア68

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

1クリップ

投稿2022/09/01 14:47

編集2022/09/07 06:11

前提

pythonのtkinterでクリックにより画像を回転させ、再度クリックすることで回転が止まるアニメーションを作成しています。

afterメソッドで無限に画像を回転させる処理を行ったうえで、後から回転をストップさせるイベントを呼び出し、アニメーションの操作を実現しています。

画像を角速度5[deg/s]で回転させようとしているにも関わらず、想定より回転速度が遅いことに困っています。
おそらく、処理が重いことが大きな要因の一つだと思われます。

実現したいこと

画像を角速度5[deg/s]で回転させたいです。

しかし、現在備わっている
・左クリックで左回転スタート
・右クリックで右回転スタート
・左右いづれかのクリックで回転をストップ
という機能は必要です。

このような機能を保ちつつ、処理を軽くして角速度を命令通りに実行できるコードにするには、どのような改良をすると良いでしょうか?

該当のソースコード

python

1import tkinter as tk 2from PIL import Image, ImageTk 3import datetime 4 5 6#新規ウィンドウを作成 7root = tk.Tk() 8root.attributes("-fullscreen", True) 9 10 11#画面サイズの指定 12WIDTH = root.winfo_screenwidth() 13HEIGHT = root.winfo_screenheight() 14 15 16#ウィンドウ上にフレームを作成 17frame = tk.Frame(root) 18frame.place(x = -5, y = -5, width = WIDTH + 10, height = HEIGHT + 10) 19 20 21#フレーム上に、キャンバスを作成 22canvas = tk.Canvas(frame, width = WIDTH, height = HEIGHT, bg = "black") 23canvas.place(x = 0, y = 0, width = WIDTH + 10, height = HEIGHT + 10) 24 25 26#画像のプリセット角を"cs"として定義 27cs = 0 28 29 30#キャンバスにSVV画像を貼り付け 31img = Image.open("D:\EXPERIMENT\programming\Python\SVV\svv_bar.png") 32img = img.rotate(cs) 33tkimg = ImageTk.PhotoImage(img, width = WIDTH, height = HEIGHT) 34canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg, anchor="center", tags="img") 35 36 37#キャンバスに、透明な画像を貼り付け 38img_snow = Image.open("D:\EXPERIMENT\programming\Python\SVV\svv_snow.png") 39tkimg_snow = ImageTk.PhotoImage(img_snow, width = WIDTH, height = HEIGHT) 40canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg_snow, anchor="center", tags="img_snow") 41 42 43#"c"の初期値を定義 44c = 0 45 46 47#角速度の指定 48interval = datetime.timedelta(milliseconds = 20) 49 50 51#左回転時の基準時刻を取得し、press_Lに渡す 52def press_L(event): 53 global next_time_L 54 next_time_L = datetime.datetime.now() 55 rotate_L(event) 56 57 58#右回転時の基準時刻を取得し、press_Rに渡す 59def press_R(event): 60 global next_time_R 61 next_time_R = datetime.datetime.now() 62 rotate_R(event) 63 64 65def rotate_L(event): 66 global interval 67 global next_time_L 68 global img 69 global tkimg 70 global c 71 c = c + 1 72 R = c / 10 73 canvas.delete("all") 74 IMG = img.rotate(R, resample = Image.BICUBIC) 75 tkimg = ImageTk.PhotoImage(IMG) 76 canvas.create_image(WIDTH/2, HEIGHT/2, image = tkimg, anchor = "center", tags = "img") 77 canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg_snow, anchor = "center", tags="img_snow") 78 next_time_L += interval 79 now = datetime.datetime.now() 80 delay_ms = int((next_time_L - now).total_seconds() * 1000) 81 id = root.after(delay_ms, rotate_L, None) 82 def stop_L(event): 83 root.after_cancel(id) 84 canvas.tag_bind("img_snow", "<ButtonPress-1>", press_L) 85 canvas.bind("<ButtonRelease-1>", stop_L) 86 87 88def rotate_R(event): 89 global interval 90 global next_time_R 91 global img 92 global tkimg 93 global c 94 c = c - 1 95 R = c / 10 96 canvas.delete("all") 97 IMG = img.rotate(R, resample = Image.BICUBIC) 98 tkimg = ImageTk.PhotoImage(IMG) 99 canvas.create_image(WIDTH/2, HEIGHT/2, image = tkimg, anchor = "center", tags = "img") 100 canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg_snow, anchor = "center", tags="img_snow") 101 next_time_R += interval 102 now = datetime.datetime.now() 103 delay_ms = int((next_time_R - now).total_seconds() * 1000) 104 id = root.after(delay_ms, rotate_R, None) 105 def stop_R(event): 106 root.after_cancel(id) 107 canvas.tag_bind("img_snow", "<ButtonPress-3>", press_R) 108 canvas.bind("<ButtonRelease-3>", stop_R) 109 110 111def finish(event): 112 #Enterキーを押すことで全画面表示を終了し、回転角度を取得する 113 root.destroy() 114 print(-c / 10) 115 116 117#左クリックで呼び出すイベント 118canvas.tag_bind("img_snow", "<ButtonPress-1>", press_L) 119 120 121#右クリックで呼び出すイベント 122canvas.tag_bind("img_snow", "<ButtonPress-3>", press_R) 123 124 125#Enterキーで呼び出すイベント 126root.bind("<Return>", finish) 127 128 129#メインループ 130root.mainloop() 131 132 133#end. 134

上記の処理に使用した画像を作成するコード

python

1from PIL import Image, ImageDraw 2 3#背景色が黒色のキャンパスを作成。 4im = Image.new('RGB', (500, 500), (0, 0, 0)) 5draw = ImageDraw.Draw(im) 6 7 8#中央に線を描画 9draw.line((50, 250, 450, 250), fill=(255, 255, 255), width=10) 10 11 12#同じサイズの画像を作成 13im_clear = Image.new("RGBA", im.size, (0, 0, 0, 0)) 14width = im.size[0] 15height = im.size[1] 16 17 18#色ごとに処理 19for x in range(width): 20 for y in range(height): 21 pixel = im.getpixel( (x, y) ) 22 23 # 黒なら処理しない 24 if pixel[0] == 0 and pixel[1] == 0 and pixel[2] == 0: 25 continue 26 27 # 黒以外なら、用意した画像にピクセルを書き込み 28 im_clear.putpixel( (x, y), pixel ) 29 30 31#SVVで表示させるバーをpng形式で保存 32im_clear.save("D:\EXPERIMENT\programming\Python\SVV\svv_bar.png", quality=100) 33 34 35 36#---透明なpng画像の作成--- 37 38#画像サイズの指定 39WIDTH = 1600 40HEIGHT = 1000 41 42 43#新しい画像を作成 44im_snow = Image.new("RGBA", (WIDTH, HEIGHT), (0, 0, 0, 0)) 45 46 47#新しい画像をもう一つ作成 48im_snow2 = Image.new("RGBA", (WIDTH, HEIGHT), (0, 0, 0, 0)) 49 50 51#色ごとに処理 52for x in range(width): 53 for y in range(height): 54 pixel = im_snow2.getpixel( (x, y) ) 55 56 # 黒なら処理しない 57 if pixel[0] == 0 and pixel[1] == 0 and pixel[2] == 0: 58 continue 59 60 # 黒以外なら、用意した画像にピクセルを書き込み 61 im_snow.putpixel( (x, y), pixel ) 62 63 64#透明な画像をpng形式で保存 65im_snow.save("D:\EXPERIMENT\programming\Python\SVV\svv_snow.png", quality=100) 66

試したこと

afterメソッドの指定時間を増やして、それに伴い "c + 0.005" の部分の数値を大きくするように変更しましたが、アニメーションがカクカク動いているように見えてしまうレベルまで処理の時間間隔を空けても、画像が360°回転するのに72秒以上の時間がかかってしまいました。
そのため、コードの改良が必要だと感じています。

呼び出すイベント関数が多いことが原因かと考え、関数の数を減らそうと試みましたが、現時点の数までしか減らせませんでした。
もし、さらに処理が軽くなるコードを思いつく方がいらっしゃいましたら、お力を貸して頂きたいです。

補足情報(FW/ツールのバージョンなど)

AnacondaでPythonを使用しています。
・Anacondaのバージョン:conda 4.12.0
・Pythonのバージョン:Python 3.9.12
・Windowsのバージョン:version 21H2

デバイスの仕様
・プロセッサ:11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz
・実装RAM:16.0 GB

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

create_image は新たな図形を作ります。以前にcreate_imageした図形をdeleteしないとメモリをどんどん消費して重たくなりますよ。
事前に state='hidden' ですべて create_imageしておいて、表示したいイメージだけ state='normal' に設定変更するようにすると処理が速くなるかもしれません。

それと、テレビ放送でも1秒間に30コマ(33ミリ秒/コマ)、ゲームで秒60コマ(16ミリ秒/コマ)や120コマ(8ミリ秒/コマ)の描画でアニメーションしています。
絶対時間のカウンタを作って、現在時刻から次の描画時刻までの差分を計算してafterの時間に指定すると正確な時間間隔で描画できるかと思います。
描画が追い付かなければ遅れていきますけど。

マウスをクリックしてから72秒で360度回転するサンプルコードを書いてみました。

py

1import tkinter as tk 2import datetime 3from math import sin, cos, radians 4 5 6# 新規ウィンドウを作成 7root = tk.Tk() 8root.title("SVV測定") 9#root.attributes("-fullscreen", True) 10 11 12# 画面サイズの指定 13WIDTH = root.winfo_screenwidth() 14HEIGHT = root.winfo_screenheight() 15 16 17# ウィンドウ上にフレームを作成 18frame = tk.Frame(root) 19frame.place(x=-5, y=-5, width=WIDTH + 10, height=HEIGHT + 10) 20 21 22# フレーム上に、キャンバスを作成 23canvas = tk.Canvas(frame, width=WIDTH, height=HEIGHT, bg="black") 24canvas.place(x=0, y=0, width=WIDTH + 10, height=HEIGHT + 10) 25 26# "c"の初期値を定義 (浮動小数点数では誤差が発生するため1000倍した角度をcの値にする) 27c = 0 28 29DEGREE_PER_SEC = 5 # 1秒間に5 度回転、360度回転するのに360/5=72秒かかる 30TIMES_PER_SEC = 50 # 1秒間に50回描画 (20ミリ秒に1回描画) 31DEGREE_PER_TIME = int(DEGREE_PER_SEC * 1000 / TIMES_PER_SEC) # 1000倍角 32interval = datetime.timedelta(milliseconds=1000/TIMES_PER_SEC) 33 34start_time = datetime.datetime.now() 35next_time = None 36timer = None 37 38def rotate(delta): 39 global timer, next_time, c 40 timer = None 41 next_time += interval # 絶対時刻更新 42 c += delta 43 44 #動作確認のため360度回転したら自動停止 45 if not -360 * 1000 <= c <= 360 * 1000: 46 finish() 47 return 48 49 # ここで描画処理するが動作確認のため簡略化 50 degree = c / 1000 51 radian = radians(degree) 52 canvas.delete("all") 53 canvas.create_line(100, 100, 100 + 50 * sin(radian), 100 - 50 * cos(radian), width=10, fill="red") 54 55 # 次の絶対時刻までの差分を計算してタイマー設定 56 now = datetime.datetime.now() 57 delay_ms = int((next_time - now).total_seconds() * 1000) 58 print(degree, delay_ms, now) 59 timer = root.after(delay_ms, rotate, delta) 60 61 62def start_stop(delta): 63 global next_time, start_time, timer 64 if timer: 65 # 回転中なので回転停止処理 66 root.after_cancel(timer) 67 timer = None 68 else: 69 # 回転開始処理 70 next_time = start_time = datetime.datetime.now() 71 rotate(delta) 72 73 74def press_L(event): 75 start_stop(DEGREE_PER_TIME) 76 77 78def press_R(event): 79 start_stop(-DEGREE_PER_TIME) 80 81 82def finish(event=None): 83 # Enterキーを押すことで全画面表示を終了し、回転角度を取得する 84 root.destroy() 85 degree = c / 1000 86 print(degree, "度回転するのにかかった秒数:", (datetime.datetime.now() - start_time).total_seconds()) 87 88 89canvas.bind("<ButtonPress-1>", press_L) # 左クリックで呼び出すイベント 90canvas.bind("<ButtonPress-3>", press_R) # 右クリックで呼び出すイベント 91root.bind("<Return>", finish) # Enterキーで呼び出すイベント 92 93root.mainloop()

追記: rotate_L と rotate_R を共通化してはいかがでしょうか?
それと、代入しない変数は global宣言不要です。

python

1# 左回転時の基準時刻を取得し、rotateに渡す 2def press_L(event): 3 global next_time 4 next_time = datetime.datetime.now() 5 rotate(+1) 6 def stop_L(event): 7 root.after_cancel(after_id) 8 canvas.tag_bind("img_snow", "<ButtonPress-1>", press_L) 9 canvas.bind("<ButtonRelease-1>", stop_L) 10 11 12# 右回転時の基準時刻を取得し、rotateに渡す 13def press_R(event): 14 global next_time 15 next_time = datetime.datetime.now() 16 rotate(-1) 17 def stop_R(event): 18 root.after_cancel(after_id) 19 canvas.tag_bind("img_snow", "<ButtonPress-3>", press_R) 20 canvas.bind("<ButtonRelease-3>", stop_R) 21 22 23def rotate(delta): 24 global next_time 25 global tkimg 26 global c 27 global after_id 28 c = c + delta 29 R = c / 10 30 canvas.delete("all") 31 IMG = img.rotate(R, resample=Image.BICUBIC) 32 tkimg = ImageTk.PhotoImage(IMG) 33 canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg, anchor="center", tags="img") 34 canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg_snow, anchor="center", tags="img_snow") 35 next_time += interval 36 now = datetime.datetime.now() 37 delay_ms = int((next_time - now).total_seconds() * 1000) 38 after_id = root.after(delay_ms, rotate, delta)

投稿2022/09/01 17:09

編集2022/09/08 06:32
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ppap

2022/09/02 07:26

回答をありがとうございます。 >create_image は新たな図形を作ります。以前にcreate_imageした図形をdeleteしないとメモリをどんどん消費して重たくなりますよ。 ■「canvas.delete("all")」を追加することで、不要な図形を削除するコードに修正しました。 >それと、テレビ放送でも1秒間に30コマ(33ミリ秒/コマ)、ゲームで秒60コマ(16ミリ秒/コマ)や120コマ(8ミリ秒/コマ)の描画でアニメーションしています。 ■コマ送りの精度として、最低でも0.1°は保ちたいという事情があるため、20コマの描画に変更しました。 >絶対時間のカウンタを作って、現在時刻から次の描画時刻までの差分を計算してafterの時間に指定すると正確な時間間隔で描画できるかと思います。 ■ここが上手くいきません。press_Lイベントの中にtime.time()など「現在時刻を読み取る」コマンドを挿入してみたのですが、エラーメッセージが表示され、時刻の読み取りができませんでした。 また、こちらのサイト (https://blog.amedama.jp/entry/2019/06/15/121632) によると、処理にかかる時間を開始・終了の前後で毎回計測して計算すると誤差が大きくなってしまうようです。 ※サイトではsleepメソッドを用いた解決策を提示していますが、私のコードはafterメソッドを用いており、応用の仕方が分かりませんでした。。 さらに、こちらのサイト (https://kuroro.blog/python/ngQRGzqfuyK8WaCwkGid/) によると、そもそもafterメソッドは関数の読み込みで秒数の誤差が生じることがあり、「誤差はしょうがないもの」として紹介されていました。 しかし、以前質問で投稿したのですが (https://teratail.com/questions/dvwgn26naav5cz)、whileによるループが上手く動作しないため、現在のafterメソッドを用いた方法を採用している経緯があります。 これらのことから、現在も「画像を角速度5[deg/s]で回転させる」ことができていません。。 大変恐縮ですが、上記を解決するアイデアがありましたら、コードを添付していただけないでしょうか。 どうぞよろしくお願いいたします。
shiracamus

2022/09/02 08:25 編集

import datetime print(datetime.datetime.now()) で時刻表示できませんか? afterで誤差が出るのを補正するために絶対時刻との差分を使って次のafter時間に指定します。 例えば1秒間隔で実行するのであれば、次に呼び出すべき絶対時刻を記録しておいて現在時刻との差分をafterに指定し、呼び出されたタイミングで次に呼び出す絶対時刻に1秒加算し、現在時刻との差分をafterに指定します。 呼び出されて画像処理するまでに1.3秒かかっていたとしたら、afterには0.7秒を指定することになります。
ppap

2022/09/05 06:04

時刻表示自体は出来ますが、イベント内で時刻表示ができません。 ソースコードの"press_L"イベントに、時刻表示を追加したものに修正いたしました。 "bt"および"lt"で時刻を定義していますが、「NameError: name 'bt' is not defined」のエラーが発生し、定義できていないようです。 そのため、printもできません。。
shiracamus

2022/09/05 12:27 編集

datetime.datetime() ではなく datetime.datetime.now() ですよ。
ppap

2022/09/06 07:58 編集

何度も回答をしてくださり、誠にありがとうございます。 大変申し訳ございません、ご指摘をありがとうございます。 "now"が抜けていた上に、globalにしていなかったため、動作していませんでした。 追記頂いたコードを拝見したところ、「ウィンドウが表示された後から」1秒ごとにprintするものだと理解しました。こちらを参考にしながら、「イベントが呼び出されてから」任意秒ごとにdelayさせるコードに修正いたしました。 動作させてみたところ、72秒で360°回転させるコードにも関わらず、72秒で240°しか回転させられませんでした。 やはり、イベントの中で2回時刻を読み取ると、ラグが生じやすくなってしまうのでしょうか?
shiracamus

2022/09/06 08:02

そもそも、処理時間は間に合っていますか? 次の絶対時間までに処理がおわらないと、delay_ms がマイナス値になって、待ち時間なしで次の描画を行うことになります。 printl(delay_ms) で待ち時間が常にプラスであることを確認してみてください。
shiracamus

2022/09/06 10:29 編集

マウスをクリックしてから72秒で360度回転するサンプルコードを書いてみました。 描画処理は省略していますが、マウスをクリックしてから72秒間放置してみてください。 これに描画処理を書き加えて72秒で終わるか確認してみてください。 1回の描画で19ミリ秒以上かかるようだと72秒で終わりません。 TIMES_PER_SEC = 50 を 5 に変更すれば 1秒間に5回描画するようになります。
ppap

2022/09/06 12:35 編集

サンプルコードをありがとうございます。 クリックしてから72秒間放置してみましたが、何も起こりませんでした。 また、多数のエラーメッセージが表示されてしまいました。 描画処理を加えたものは回転が開始しないので、修正中です。
shiracamus

2022/09/06 13:23 編集

コンソールにメッセージが出力されていませんか? $ python3 sample.py 0.1 19 2022-09-06 22:21:00.203371 0.2 20 2022-09-06 22:21:00.222778 0.3 20 2022-09-06 22:21:00.243317 0.4 19 2022-09-06 22:21:00.263808 0.5 20 2022-09-06 22:21:00.283129 0.6 19 2022-09-06 22:21:00.303424 (中略) 359.5 19 2022-09-06 22:22:12.083624 359.6 20 2022-09-06 22:22:12.102916 359.7 19 2022-09-06 22:22:12.123385 359.8 20 2022-09-06 22:22:12.143019 359.9 19 2022-09-06 22:22:12.163419 360.0 20 2022-09-06 22:22:12.182713 360.1 度回転するのにかかった秒数: 72.002465
shiracamus

2022/09/06 13:49

秒針のようなものを描く処理を追加してみました。
ppap

2022/09/06 14:05

出力されていません。 私はAnaconda Promptで「python」と入力して対話モードにしてからコードを実行しているのですが、shiracamusさんはどのような方法でコードを入力しておられますか?
shiracamus

2022/09/06 14:49 編集

WindowsのコマンドプロンプトやWSL2(Ubuntu)のシェルで 、 python3 スクリプト名 で実行しています。
shiracamus

2022/09/07 02:36 編集

修正されたコードの next_time = datetime.datetime.now() + interval では、絶対時刻になっていないので、処理時間に影響されてどんどん遅くなっていきますよ。 私のコードでは next_time += interval # 絶対時刻更新 で絶対時刻を更新していて現在時刻には左右されません。
ppap

2022/09/07 02:56

絶対時刻の記述箇所に関して回答を追記いただき、誠にありがとうございます。 "next_time += interval"とできるのは関数を呼び出したタイミングで既に「next_time」の定義を終えているからだと思います。 しかし、今回作成しようとしているコードでは「初回だけnext_time = datetime.datetime.now()」と定義してから、2周目以降は「interval」を足していく必要があります。 (いつクリックして回転開始するか、まちまちな為) いただいたサンプルコードではそのポイントを考慮してくださっているのかもしれないのですが、私の環境では全く動作しない上に、私自身の理解が追い付いていないため、絶対時刻の更新に関しての問題をクリアできていません。
shiracamus

2022/09/07 03:31 編集

あなたのコードでは press_L や press_R 関数の最初の next_time = datetime.datetime.now() + interval で現在時刻からの固定時間後を次の時間にしていて root.after(delay_ms, press_R, None) で、関数を再度呼び出しているため、root.after 関数を呼んでから実際に press_R や press_L 関数が呼び出されるまでの遅延時間を考慮せずにnext_timeが更新されていきます。その間にtkinterエンジンが描画反映処理やイベント処理を行うので、結構遅延しますよ。 私のコードでは、回転開始処理をする start_stop関数で、初回だけ next_time = datetime.datetime.now() を実行していて、rotate関数では next_time += interval と「interval」を足して2回目以降の実行時間を決めて root.after(delay_ms, rotate, delta) でrotate関数を再度呼び出しているので、関数呼び出しまでの遅延時間に影響されることなく絶対時間間隔で関数が呼び出されます。 是非とも、私のコードで何をしているのか処理を追ってみてください。
shiracamus

2022/09/07 03:30

直前のコメントを修正ミスしていたため訂正しました。
ppap

2022/09/07 06:13

何度もアドバイスを下さり、本当にありがとうございました。 なぜ"next_time = start_time = datetime.datetime.now()"とするのか等、最後まで理解できなかった箇所もありましたが、shiracamusさんのコードを参考に、任意の角速度で回転させるコードを作成することができました。 (コードは修正済みです。)
shiracamus

2022/09/07 06:17 編集

next_time = datetime.datetime.now() は、クリックした時点を回転開始絶対時間にするための代入です。 start_time にも代入しているのは、360度回転後に実際にどれだけの時間を要したかをprintするためのもので、本番環境ではstart_time = の部分は削除してください。
shiracamus

2022/09/07 06:49

rotate_L と rotate_R を共通化するコードを追記しました。
ppap

2022/09/07 11:38

next_time, start_timeに関する解説、rotateの共通化に関するアイデアを頂き、ありがとうございます。
ppap

2022/09/08 05:36

回答の追記をありがとうございます。 このように共通化することもできるのですね、参考にさせて頂きます。 グローバル宣言に関してもありがとうございます。 間違って理解していることに気が付いていなかったので、とても理解が深まりました。
shiracamus

2022/09/08 06:13

あと、Python標準で id関数 があるので、変数名に id は使わない方がいいですよ。 after_id とかにしてはいかがでしょうか?
ppap

2022/09/08 07:35

id関数というものもあるのですね。 教えていただき、ありがとうございます。 after_id等の名前に変えてみようかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問