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

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

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

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

解決済

1回答

2377閲覧

Python3 非同期処理について

AMK

総合スコア765

Python 3.x

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

1クリップ

投稿2021/04/06 06:06

編集2021/04/06 06:09

次のボタンが押されるまでループを続けるプログラムを組みたくて試行錯誤しております。

色々試してココまで作成できたのですが行き詰ったので質問させていただきます。

Python3

1import tkinter 2from tkinter import messagebox 3from tkinter.scrolledtext import ScrolledText 4import asyncio 5import time 6import threading 7 8root = tkinter.Tk() 9root.geometry("250x400") 10#実行中判別フラグ 11flag=0 12 13def btn1(): 14 global flag 15 if flag == 0: 16 flag = 1 17 btn1.configure(text = "停止") 18 btn1['fg']='#dc143c' 19 loop = asyncio.get_event_loop() 20 loop.run_until_complete(mainloop()) 21 else: 22 flag=0 23 btn1.configure(text = "実行") 24 btn1['fg']='#000' 25 26# ボタン作成 27btn1 = tkinter.Button(root, text='実行',width=20,command=btn1) 28btn1.place(x=45, y=350)

現状

グローバル変数 flag が0になるまでループを繰り返すプログラムを作っているつもりです

btn1を押すとグローバル変数flagに1を入れて そこから非同期でループ処理を実行させれば
ループ処理が実行されて、またボタンが押せるように、なる予定だったのですが・・・

実際はボタンがグレーアウトしてしまいボタンが押せない状態になってしまいました。

やりたいこと

ボタンを押して無限ループのON OFFをしたい。

もしかしたら私のアプローチが間違ってるかもしれませんがよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題点: イベントループの競合

asyncio と tkinter 双方がイベントループを持つので、
どちらか片方が実行されてる間は、必然的に他方は停止します。

tkinter で asyncio を使う方法として回答すると

  • A: asyncio のイベントループを 別thread/process で動かす (イベントループの分離)
  • B: tkinter のイベントループを asyncio で動かす (イベントループの統合)

但し、目的が「無限ループの非同期処理」だけであれば、
スレッドのみで実現できるのでasyncio は不要です。

他に、非同期処理の方法としては、ジェネレータを使う方法もあります

  • C: 無限ループをジェネレーターで実装して、タイマーで処理する

ボタンを押して無限ループのON OFFをしたい。

asyncio 利用という事から、I/O を扱う処理だと思いますが、
無限ループ内では具体的にどのような処理を行いますか?

幾つかサンプルコードを紹介できますが、
内容によって適切な対応方法が変わってきます。

  • CPU bound な処理 → マルチプロセス
  • I/O bound な処理 → マルチスレッド, asyncio
  • GUI のアニメーション → GUIイベントループが提供するタイマーで処理

投稿2021/04/06 06:58

編集2021/04/06 08:34
teamikl

総合スコア8760

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

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

AMK

2021/04/06 09:22

Aプランで無事やりたい事が出来ました!! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問