いつもお世話になります。
PLCとラズパイをつないでデータを書き込み・取得するプログラムの準備中です。
今回はラズパイに画面を設け、バーコードリーダーで品番を読み込み該当するパラメーターをDBより取得します。
そのパラメーターをPLCに書き込みご後、ラズパイでPLCから動作結果のデータを取得します。
準備として『Tkinter with Serial』(https://robotic-controls.com/learn/python-guis/tkinter-serial)などを参考にさせていただき
GUI画面に時計を表示するものを作ってみました。この時計表示の部分をPLCからデータを取得する動作にするつもりです。
とりあえず時計表示のソースは以下となります。
import tkinter as tk import time import datetime as dt import threading #make a TkInter Window root = tk.Tk() root.title("Reading Clock") # make a scrollbar scrollbar = tk.Scrollbar(root) scrollbar.pack(side=tk.RIGHT, fill="y") # make a text box to put the time log = tk.Text(root, width=30, height=30, takefocus=0) log.pack() # attach text box to scrollbar log.config(yscrollcommand=scrollbar.set) scrollbar.config(command=log.yview) def subthread(): thread_2 = threading.Thread(target=readTime) thread_2.setDaemon(True) thread_2.start() def readTime(): while True: # 現在の時刻を取得 dNow = dt.datetime.today() # 書き込み用日付の文字列を作成する nowStr = dNow.strftime("%H:%M:%S") log.insert('insert', nowStr+'\n') time.sleep(1) def on_closing(): root.destroy() # GUIクローズ処理 root.protocol("WM_DELETE_WINDOW", on_closing) # 画面表示後の処理 root.after(100, subthread) root.mainloop()
『Tikinter with serial』ではafter()を繰り返すことで実現しているようでしたが時計表示で試したところ時計が表示されず、希望した動作にはならなかったので別スレッドを立てる方法にしてみたところ時計が画面上で表示・更新されましたので希望する動作となりました。
また、『insert』はカーソル位置に挿入するということでしたので表示のボックス内でクリックするとその位置から追加されていくのでTikinter側もちゃんと反応していると思います。
そこで問題なのは止めるときの処理なんですがスレッドを開始する際に『thread_2.setDaemon(True)』としてメイン(この場合Tkinter側)が止まった場合には強制的に止めますとし、『root.protocol("WM_DELETE_WINDOW", on_closing)』で呼び出しています。
これでWindowの『X』で閉じることは閉じるのですが以下のようなエラーが表示されます。
>>> Exception in thread Thread-1: Traceback (most recent call last): File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner self.run() File "/usr/lib/python3.5/threading.py", line 862, in run self._target(*self._args, **self._kwargs) File "/home/pi/PyPrg/tkseri.py", line 33, in readTime log.insert('insert', nowStr+'\n') File "/usr/lib/python3.5/tkinter/__init__.py", line 3130, in insert self.tk.call((self._w, 'insert', index, chars) + args) _tkinter.TclError: invalid command name ".1966440848"
詳しないのですが時計表示部の『While True』を止めていない状態で終了してしまうためだと思います。
いろいろ考えてみましたが良い解決方法が見つかりません。単純にエラーを出さなくするでも良いとは思いますがよろしくお願いいたします。
また、『readTime』でエラーが発生した場合の対処方法も頂けましたら助かります。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー