質問編集履歴
3
加筆
title
CHANGED
File without changes
|
body
CHANGED
@@ -159,11 +159,9 @@
|
|
159
159
|
できるだけ早いグラフ更新(2ms更新を目指していたが受信都度更新だと10msが限界だなあと感じていたところ)を目指していたのであまり処理が長くなるのは避けたかったのですが、サブスレッドはデータの受信のみとし、メインに受信データを渡してグラフ描画としなければならないということでしょうか?
|
160
160
|
|
161
161
|
|
162
|
-
別件でTkinterの使い方なのですが、
|
163
|
-
|
162
|
+
別件となりますが、スレッドに描画を任せた理由はリアルタイム処理のためにメインスレッドをループさせるとGUIが操作できないから、というのを忘れてメインスレッドをループさせて描画・更新をさせたのですが
|
164
|
-
|
163
|
+
メインスレッドがWhileループ内にいるにもかかわらず、GUIの操作ができ、ボタンも反応しました。(おそらく)self.fig.canvas.flush_events()がループに存在しているのが原因だと思われるのですが、なぜGUIの操作ができるのでしょうか
|
165
164
|
|
166
|
-
|
167
165
|
```python
|
168
166
|
import tkinter as tk
|
169
167
|
import tkinter.ttk as ttk
|
2
追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -159,6 +159,11 @@
|
|
159
159
|
できるだけ早いグラフ更新(2ms更新を目指していたが受信都度更新だと10msが限界だなあと感じていたところ)を目指していたのであまり処理が長くなるのは避けたかったのですが、サブスレッドはデータの受信のみとし、メインに受信データを渡してグラフ描画としなければならないということでしょうか?
|
160
160
|
|
161
161
|
|
162
|
+
別件でTkinterの使い方なのですが、
|
163
|
+
Button3 = tk.Button(frame_2,text=u'描画', command=self.DrawingValue)にqを引数として与えたく思い、
|
164
|
+
Button3 = tk.Button(frame_2,text=u'描画', command=self.DrawingValue(q))としたところ、なぜか実行時にDrawingValue(q)が実行されてしまいます。引数を与えるためにはどう設定すればよいでしょうか?
|
165
|
+
|
166
|
+
|
162
167
|
```python
|
163
168
|
import tkinter as tk
|
164
169
|
import tkinter.ttk as ttk
|
1
追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -145,4 +145,37 @@
|
|
145
145
|
また、描画を行わず即時終了した時もエラーは発生しませんでした。
|
146
146
|
どこまで削除したらエラーが発生しないかとworker1内を削って確かめた結果、self.fig, self.ax = plt.subplots()を削除した場合エラーが発現しませんでした。
|
147
147
|
|
148
|
-
最悪デーモンスレッドで終了でもいいのですが、図を表示したまま終了させたときにエラーが出てしまうので何とかさせたいです、よろしくお願いします。
|
148
|
+
最悪デーモンスレッドで終了でもいいのですが、図を表示したまま終了させたときにエラーが出てしまうので何とかさせたいです、よろしくお願いします。
|
149
|
+
|
150
|
+
#####追記####################
|
151
|
+
|
152
|
+
追記前よりクローズ処理は実装しておりましたので、GUIの直接操作が問題なのかな?でもGUI直接操作しているかな?と思い、teamikl様の回答をもとに少し触ってみたのですが、「fig, ax = plt.subplots()」や「fig = plt.figure()」をサブスレッドで実行する場合にRuntimeErrorが発生するようでした。print("endworler")も書き出されているのでスレッドは終了しているはずです。
|
153
|
+
|
154
|
+
|
155
|
+
サブスレッドでGUIを動かすべきでないというのはTkinterの話だと思っていたのですが、Matplotlibも実行すべきでないのでしょうか?
|
156
|
+
|
157
|
+
|
158
|
+
元々のプログラムは1ずつ上昇してるグラフの代わりに受信したデータをリアルタイムで表示するようにしているため、メインスレッドはメインループ、サブスレッドはリアルタイム描画用としておりました。
|
159
|
+
できるだけ早いグラフ更新(2ms更新を目指していたが受信都度更新だと10msが限界だなあと感じていたところ)を目指していたのであまり処理が長くなるのは避けたかったのですが、サブスレッドはデータの受信のみとし、メインに受信データを渡してグラフ描画としなければならないということでしょうか?
|
160
|
+
|
161
|
+
|
162
|
+
```python
|
163
|
+
import tkinter as tk
|
164
|
+
import tkinter.ttk as ttk
|
165
|
+
from threading import Thread
|
166
|
+
import matplotlib.pyplot as plt
|
167
|
+
|
168
|
+
|
169
|
+
def worker(root):
|
170
|
+
print("startworler")
|
171
|
+
#fig, ax = plt.subplots()#←これの有無でエラー
|
172
|
+
#fig = plt.figure()#←これの有無でエラー
|
173
|
+
print("endworler")
|
174
|
+
|
175
|
+
root = tk.Tk()
|
176
|
+
thread = Thread(target=worker, args=(root,))
|
177
|
+
|
178
|
+
root.after(1000*1, thread.start) # 1秒後に開始
|
179
|
+
root.after(1000*3, root.quit) # 3秒後にGUIを終了
|
180
|
+
root.mainloop()
|
181
|
+
```
|