回答編集履歴

3

コードの余分な部位を削除

2019/07/07 04:08

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -136,18 +136,6 @@
136
136
 
137
137
 
138
138
 
139
- def main2():
140
-
141
- loop = asyncio.get_event_loop()
142
-
143
- # loop.run_until_complete(main())
144
-
145
- asyncio.run(main(), debug=True)
146
-
147
-
148
-
149
-
150
-
151
139
  if __name__ == '__main__':
152
140
 
153
141
  main1()

2

誤記

2019/07/07 04:08

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  - Tkinterはメインスレッドで動かす。
6
6
 
7
- run_in_executorを使ってしまうとメインスレッド以外でTkinterが実行されることになるためか、ご質問にあるとおりうまくいかないようです。メインスレッド以外でTkinterのイベントループが動くものかどうかよく調べてはいないですが・・・。よってTkinterに関する処理をasyncioのタスクとして動かすのはあきらめざるを得ないように思います。async関数の中でTkinterを呼び出しても動くことは動くでしょうが、そこで非同期I/O処理は全て止まってしまうため並行し動かしたいならasyncioを動かすスレッドとは別のスレッドで動かす必要があるように思います。
7
+ run_in_executorを使ってしまうとメインスレッド以外でTkinterが実行されることになるためか、ご質問にあるとおりうまくいかないようです。メインスレッド以外でTkinterのイベントループが動くものかどうかよく調べてはいないですが・・・。よってTkinterに関する処理をasyncioのタスクとして動かすのはあきらめざるを得ないように思います。async関数の中でTkinterを呼び出しても動くことは動くでしょうが、そこで非同期I/O処理は全て止まってしまうため並行し動かしたいならasyncioを動かすスレッドとは別のスレッドで(asyncioの枠組みとは別の世界で)動かす必要があるように思います。
8
8
 
9
9
 
10
10
 

1

訂正

2019/07/07 04:07

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -1,8 +1,4 @@
1
- 完全な解決になってないですが・・・
2
-
3
-
4
-
5
- 自分はまず次のように考えました。
1
+ 適切な回答かどうか信がない(asyncioの仕様経験が乏しい)のですが、自分は次のように考えました。
6
2
 
7
3
 
8
4
 
@@ -24,7 +20,7 @@
24
20
 
25
21
  - Tkinterの処理をasyncio側で待つ
26
22
 
27
- asyncio.Futureを作り、メインスレッド側でそのFutureにset_resultで結果を設定してやるとasyncio処理側でそのFutureを待つことで同期および結果が利用できると考えました。他にもっとよい(自然)な方法があるかも知れません・・・
23
+ asyncio.Futureを作り、メインスレッド側でそのFutureにset_resultで結果を設定してやるとasyncio処理側でそのFutureを待つことで同期および結果が利用できると考えました。他にもっとよい(自然)な方法があるかも知れません・・・
28
24
 
29
25
 
30
26