質問編集履歴

3

加筆

2021/10/15 08:02

投稿

NKJSM
NKJSM

スコア58

test CHANGED
File without changes
test CHANGED
@@ -320,13 +320,9 @@
320
320
 
321
321
 
322
322
 
323
- 別件でTkinterの使い方なのですが、
324
-
325
- Button3 = tk.Button(frame_2,text=u'描画', command=self.DrawingValue)q引数与えく思い、
323
+ 別件となりますが、スレッドに描画を任せた理由はリアルタイム処理のためメインスレッドループさせるGUIが操作できないから、というのを忘れメインスレッドをループさせて描画・更新をさせのですが
326
-
324
+
327
- Button3 = tk.Button(frame_2,text=u'描画', command=self.DrawingValue(q))としたところ、なぜか実行時にDrawingValue(q)が実行されしまます。引数を与えためにはどう設定すばよいでしょうか
325
+ メインスレッドがWhileループ内にいるにもかかわらず、GUIの操作ができ、ボタンも反応しました。(おそらく)self.fig.canvas.flush_events()がループに存在しているのが原因だと思わるのすが、なぜGUIの操作ができるのでしょうか
328
-
329
-
330
326
 
331
327
 
332
328
 

2

追加

2021/10/15 08:01

投稿

NKJSM
NKJSM

スコア58

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

追加

2021/10/15 02:31

投稿

NKJSM
NKJSM

スコア58

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
+ ```