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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Q&A

解決済

1回答

2070閲覧

pythonでループを抜け出す方法

soniroji

総合スコア18

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

0グッド

0クリップ

投稿2018/08/07 09:07

現在discordのbotを作成していまして、
!startというコマンドでループする動作を
!stopというコマンドで止めたいのですが
whileを使用して、もしくは別の方法でいいやり方がないでしょうか。

python

1async def on_message(message): 2 if message.content.startswith('!start'): 3 while True: 4 try: 5 aaa = 1 6 break 7 except: 8 if message.content.startswith('!stop'): 9 stop = "終わります" 10 await client.send_message(message.channel, stop) 11 break 12 else: 13 time.sleep(30) 14

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

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

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

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

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

y_waiwai

2018/08/07 09:12

このコード、ちゃんと動くんでしょうか
soniroji

2018/08/07 09:18

いえ、これ自体は動かないです。実際はもっと長いのですが、tryの部分に色々と個人情報が入っていたため省略しました。
guest

回答1

0

ベストアンサー

Threadを使えばよいのではないでしょうか

このサンプルは2回目の "!start" メッセージは考慮しておりません

Python

1import threading 2import time 3 4def on_running(): 5 while not stop_event.is_set(): 6 # なんかの処理 7 time.sleep(1) 8 9stop_event = threading.Event() 10running_thread = threading.Thread(target = on_running) 11 12async def on_message(message): 13 if message.content.startswith('!start'): 14 # Thread開始 15 running_thread.start() 16 elif message.content.startswith('!stop'): 17 # Thread停止 18 stop_event.set() 19 running_thread.join()

投稿2018/08/07 09:55

編集2018/08/07 10:39
magichan

総合スコア15898

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

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

soniroji

2018/08/07 10:26

ありがとうございます! 調べてみると思ていたことができそうです。 ちなみにこれに対して if message.content.startswith('!start'): これが返信になるのですが await client.send_message(message.channel, stop) これはwhileの中に入れたままでいいのでしょうか?
magichan

2018/08/07 11:07

スミマセン。一部コードにミスがありましたので修正しました。 上記のコメントに関しては、仕様がよくわからないのですが、 on_message() に "!stop" メッセージを受信して処理が終了した際に、(誰かに)メッセージを送りたいということでしょうか? であればループの中ではなくて running_thread.join() # ←スレッドが終了するまで待つ処理 の次の行でも良い気がします
soniroji

2018/08/07 11:42

ありがとうございます。 一応やりたいことはbeautifulsoupを使用してブログを更新したらdiscordに流す(メッセージを送る)というようなことです・・。 初心者なので、常に調べながらなんですが例えばwhileのtryで変数への代入を行ったとします。 (例えばそのブログのタイトル) それをon_message(message):以下で処理するメッセージで送りたい場合はどういった記述をしたらいいでしょうか。 そのまま処理しようとすると変数にUndefined variableエラーが出てしまいます。
magichan

2018/08/08 01:36

遅くなりました。 確認ですが、 ・client.send_message() は discord に対してメッセージを送信する為のAPI ・"!stop" がきた時に上記のAPIにてメッセージ送信をしたい ということでよろしいですかね。 であれば、 "!stop" を受信して "stop_event.set()" を行うことにより、on_running() 関数のループ処理を抜けるので、ループを抜けた後の処理で行えばよいのではないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問