質問編集履歴
3
加筆
test
CHANGED
File without changes
|
test
CHANGED
@@ -320,13 +320,9 @@
|
|
320
320
|
|
321
321
|
|
322
322
|
|
323
|
-
別件でTkinterの使い方なのですが、
|
324
|
-
|
325
|
-
|
323
|
+
別件となりますが、スレッドに描画を任せた理由はリアルタイム処理のためにメインスレッドをループさせるとGUIが操作できないから、というのを忘れてメインスレッドをループさせて描画・更新をさせたのですが
|
326
|
-
|
324
|
+
|
327
|
-
|
325
|
+
メインスレッドがWhileループ内にいるにもかかわらず、GUIの操作ができ、ボタンも反応しました。(おそらく)self.fig.canvas.flush_events()がループに存在しているのが原因だと思われるのですが、なぜGUIの操作ができるのでしょうか
|
328
|
-
|
329
|
-
|
330
326
|
|
331
327
|
|
332
328
|
|
2
追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -320,6 +320,16 @@
|
|
320
320
|
|
321
321
|
|
322
322
|
|
323
|
+
別件でTkinterの使い方なのですが、
|
324
|
+
|
325
|
+
Button3 = tk.Button(frame_2,text=u'描画', command=self.DrawingValue)にqを引数として与えたく思い、
|
326
|
+
|
327
|
+
Button3 = tk.Button(frame_2,text=u'描画', command=self.DrawingValue(q))としたところ、なぜか実行時にDrawingValue(q)が実行されてしまいます。引数を与えるためにはどう設定すればよいでしょうか?
|
328
|
+
|
329
|
+
|
330
|
+
|
331
|
+
|
332
|
+
|
323
333
|
```python
|
324
334
|
|
325
335
|
import tkinter as tk
|
1
追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -293,3 +293,69 @@
|
|
293
293
|
|
294
294
|
|
295
295
|
最悪デーモンスレッドで終了でもいいのですが、図を表示したまま終了させたときにエラーが出てしまうので何とかさせたいです、よろしくお願いします。
|
296
|
+
|
297
|
+
|
298
|
+
|
299
|
+
#####追記####################
|
300
|
+
|
301
|
+
|
302
|
+
|
303
|
+
追記前よりクローズ処理は実装しておりましたので、GUIの直接操作が問題なのかな?でもGUI直接操作しているかな?と思い、teamikl様の回答をもとに少し触ってみたのですが、「fig, ax = plt.subplots()」や「fig = plt.figure()」をサブスレッドで実行する場合にRuntimeErrorが発生するようでした。print("endworler")も書き出されているのでスレッドは終了しているはずです。
|
304
|
+
|
305
|
+
|
306
|
+
|
307
|
+
|
308
|
+
|
309
|
+
サブスレッドでGUIを動かすべきでないというのはTkinterの話だと思っていたのですが、Matplotlibも実行すべきでないのでしょうか?
|
310
|
+
|
311
|
+
|
312
|
+
|
313
|
+
|
314
|
+
|
315
|
+
元々のプログラムは1ずつ上昇してるグラフの代わりに受信したデータをリアルタイムで表示するようにしているため、メインスレッドはメインループ、サブスレッドはリアルタイム描画用としておりました。
|
316
|
+
|
317
|
+
できるだけ早いグラフ更新(2ms更新を目指していたが受信都度更新だと10msが限界だなあと感じていたところ)を目指していたのであまり処理が長くなるのは避けたかったのですが、サブスレッドはデータの受信のみとし、メインに受信データを渡してグラフ描画としなければならないということでしょうか?
|
318
|
+
|
319
|
+
|
320
|
+
|
321
|
+
|
322
|
+
|
323
|
+
```python
|
324
|
+
|
325
|
+
import tkinter as tk
|
326
|
+
|
327
|
+
import tkinter.ttk as ttk
|
328
|
+
|
329
|
+
from threading import Thread
|
330
|
+
|
331
|
+
import matplotlib.pyplot as plt
|
332
|
+
|
333
|
+
|
334
|
+
|
335
|
+
|
336
|
+
|
337
|
+
def worker(root):
|
338
|
+
|
339
|
+
print("startworler")
|
340
|
+
|
341
|
+
#fig, ax = plt.subplots()#←これの有無でエラー
|
342
|
+
|
343
|
+
#fig = plt.figure()#←これの有無でエラー
|
344
|
+
|
345
|
+
print("endworler")
|
346
|
+
|
347
|
+
|
348
|
+
|
349
|
+
root = tk.Tk()
|
350
|
+
|
351
|
+
thread = Thread(target=worker, args=(root,))
|
352
|
+
|
353
|
+
|
354
|
+
|
355
|
+
root.after(1000*1, thread.start) # 1秒後に開始
|
356
|
+
|
357
|
+
root.after(1000*3, root.quit) # 3秒後にGUIを終了
|
358
|
+
|
359
|
+
root.mainloop()
|
360
|
+
|
361
|
+
```
|