質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

1回答

1451閲覧

python3.7 [測定終了]ボタンを押すと正常終了に見えるが、カーネルが正常終了しない。

sasamata

総合スコア12

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2020/01/20 03:55

前提・実現したいこと

python3.7で、マルチスレッドを使い電圧計を作成しています(arduino側より値出力)。
[測定開始]ボタンでデータの取り込みを開始し、[測定終了]で、データのサンプリングを
終了させたいと考えています。
発生している問題・エラーメッセージ

発生している問題・エラーメッセージ

最初の1回目は問題なく動作します。
再起動させたとき「カーネル停止しました。再起動中」と表示され、
カーネル再起動後は通常に動作します。

該当のソースコード

ソースコード

python3.7

1import tkinter as tk 2import datetime 3import serial 4import time 5import threading 6 7ser = serial.Serial("COM6",9600) 8 9def serial_data_recv(): 10 global stop_flag 11 global thread 12 stop_flag = True 13 14 num = 0 15 16 # 通信最初の50要素から読み(通信のゴミを読み飛ばす) 17 print("通信バッファクリア中……") 18 for i in range(50): 19 ser.readline().rstrip() #\r\n削除 20 21 print("測定開始") 22 23 f_now = datetime.datetime.now() #現在時刻取得 24 # ファイル名を時刻.csvに設定 25 recv_data = f_now.strftime('%Y%m%d_%H%M') + ".csv" 26 with open(recv_data,'w') as f: #ファイルオープン 27 while True: 28 if stop_flag == False: 29 break 30 else: 31 line = ser.readline().rstrip() #\r\n削除 32 s_line = str(line) #文字列化 33 w_line = s_line.strip("b'") #受信文字から"b、'"を削除 34 35 fl_line = float(w_line) 36 SEN_OUT = (fl_line * 5.0)/1023 # 0-5vに変換 37 SEN_OUT2 = round(SEN_OUT,2) 38 now = datetime.datetime.now() #現在時刻取得 39 40 #ファイルフォーマットを整えて書き込み 41 file_time0 = now.strftime('%H') 42 f.write(str(file_time0)) 43 f.write(":") 44 file_time1 = now.strftime('%M') 45 f.write(str(file_time1)) 46 file_time2 = now.strftime('%S') 47 f.write(":") 48 f.write(str(file_time2)) 49 f.write(",") 50 f.write(str(SEN_OUT2)) #受信データ書き込み 51 f.write(",") 52 f.write("V") 53 f.write(",\n") #","と改行挿入 54 55 print(" " + (str(SEN_OUT2)) + " V") 56 num += 1 57 58 f.close() 59 ser.close() 60 print("測定終了") 61 time.sleep(5) 62 root.destroy() 63 64def stop(): 65 global stop_flag 66 global thread 67 stop_flag = False 68 69 70root = tk.Tk() 71root.title("検査 静電容量") 72root.geometry("250x220+1000+10") 73 74thread_1 = threading.Thread(target = serial_data_recv) 75thread_2 = threading.Thread(target = stop) 76 77button1 = tk.Button(root, text = "測定開始", font=("MSゴシック", 14), 78 command = thread_1.start) 79button1.place(x = 80, y = 30) 80 81button2 = tk.Button(root, text = "測定終了", font=("MSゴシック", 14), 82 command = thread_2.start) 83button2.place(x = 80, y = 70) 84 85 86#label01 = tk.Label(root, text = "測定回数入力", font=("MSゴシック", 14)) 87#label01.place(x = 63, y = 70) 88 89#e_box01 = tk.Entry(width = 4, font = ("MSゴシック", 20)) 90#e_box01.place(x = 100, y = 100) 91 92#r_box = tk.Text(root, font = ("MSゴシック", 20)) 93#r_box = tk.Text(root) 94#r_box.place(x = 63, y = 150, width = 100, height = 30) 95 96root.mainloop() 97

試したこと

前回のエラーメッセージ対策で色々といじっていたら、こうなってしまった。

## ここにより詳細な情報を記載してください。
開発環境 spyder3 windows10(64ビット)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2020/01/20 03:57

同じ内容で多重投稿したのであれば、どちらかに削除リクエストを出しておいてください。質問は編集できるので、修正等は次回から編集機能を使って対応するようお願いします。
sasamata

2020/01/20 05:15

申す訳ありません。そのようにします。
guest

回答1

0

ベストアンサー

別スレッドで root.destroy() が効かないようです。

グローバル変数を使う代わりにクラスにした以下のコードで試して、うまく終了することを確認できました。

python

1import tkinter as tk 2import datetime 3import serial 4import time 5import threading 6 7 8class Measure: 9 10 def stop(self): 11 self.running = False 12 self.stopped = False 13 root.after(1000, self._wait) 14 15 def _wait(self): 16 if self.stopped: 17 root.destroy() 18 else: 19 root.after(1000, self._wait) 20 21 def start(self): 22 threading.Thread(target=self._run).start() 23 24 def _run(self): 25 self.running = True 26 27 ser = serial.Serial("COM6", 9600) 28 29 # 通信最初の50要素から読み(通信のゴミを読み飛ばす) 30 print("通信バッファクリア中……") 31 for i in range(50): 32 ser.readline().rstrip() # \r\n削除 33 34 print("測定開始") 35 36 f_now = datetime.datetime.now() # 現在時刻取得 37 # ファイル名を時刻.csvに設定 38 recv_data = f_now.strftime('%Y%m%d_%H%M') + ".csv" 39 with open(recv_data, 'w') as f: # ファイルオープン 40 while self.running: 41 self.logging(ser, f) 42 43 ser.close() 44 print("測定終了") 45 self.stopped = True 46 47 def logging(self, ser, f): 48 line = ser.readline().rstrip() # \r\n削除 49 s_line = str(line) # 文字列化 50 w_line = s_line.strip("b'") # 受信文字から"b、'"を削除 51 52 fl_line = float(w_line) 53 SEN_OUT = (fl_line * 5.0)/1023 # 0-5vに変換 54 SEN_OUT2 = round(SEN_OUT, 2) 55 now = datetime.datetime.now() # 現在時刻取得 56 57 # ファイルフォーマットを整えて書き込み 58 file_time0 = now.strftime('%H') 59 f.write(str(file_time0)) 60 f.write(":") 61 file_time1 = now.strftime('%M') 62 f.write(str(file_time1)) 63 file_time2 = now.strftime('%S') 64 f.write(":") 65 f.write(str(file_time2)) 66 f.write(",") 67 f.write(str(SEN_OUT2)) # 受信データ書き込み 68 f.write(",") 69 f.write("V") 70 f.write(",\n") # ","と改行挿入 71 print(" " + (str(SEN_OUT2)) + " V") 72 73 74measure = Measure() 75 76root = tk.Tk() 77root.title("検査 静電容量") 78root.geometry("250x220+1000+10") 79 80 81button1 = tk.Button(root, text="測定開始", font=("MSゴシック", 14), 82 command=measure.start) 83button1.place(x=80, y=30) 84 85button2 = tk.Button(root, text="測定終了", font=("MSゴシック", 14), 86 command=measure.stop) 87button2.place(x=80, y=70) 88 89 90#label01 = tk.Label(root, text = "測定回数入力", font=("MSゴシック", 14)) 91#label01.place(x = 63, y = 70) 92 93#e_box01 = tk.Entry(width = 4, font = ("MSゴシック", 20)) 94#e_box01.place(x = 100, y = 100) 95 96#r_box = tk.Text(root, font = ("MSゴシック", 20)) 97#r_box = tk.Text(root) 98#r_box.place(x = 63, y = 150, width = 100, height = 30) 99 100root.mainloop()

投稿2020/01/20 05:14

編集2020/01/20 07:33
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sasamata

2020/01/20 07:34

ご教授、ありがとうございます。 問題なく動作しました。もう少しpythonの勉強をします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問