teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

加筆

2021/10/15 08:02

投稿

NKJSM
NKJSM

スコア58

title CHANGED
File without changes
body CHANGED
@@ -159,11 +159,9 @@
159
159
  できるだけ早いグラフ更新(2ms更新を目指していたが受信都度更新だと10msが限界だなあと感じていたところ)を目指していたのであまり処理が長くなるのは避けたかったのですが、サブスレッドはデータの受信のみとし、メインに受信データを渡してグラフ描画としなければならないということでしょうか?
160
160
 
161
161
 
162
- 別件でTkinterの使い方なのですが、
163
- Button3 = tk.Button(frame_2,text=u'描画', command=self.DrawingValue)q引数して与えたく思い、
162
+ 別件となりますが、スレッドに描画を任せた理由はリアルタイム処理のためメインスレッドループさせるGUIが操作できなからというのを忘れてメインスレッドをループさせて描画・更新をさせたのですが
164
- Button3 = tk.Button(frame_2,text=u'描画', command=self.DrawingValue(q))ところ、なぜか実行時にDrawingValue(q)実行されてしまいます。引数を与えためにはどう設定すればよいでしょうか
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

追加

2021/10/15 08:01

投稿

NKJSM
NKJSM

スコア58

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

追加

2021/10/15 02:31

投稿

NKJSM
NKJSM

スコア58

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