前提・実現したいこと
PyQt5のQLabelにidmを表示したい。
ICリーダーはRC-S380を使用
startボタンを押してタッチすると下のエラーメッセージがでてラベルに表示されません。
どこをどう直せばいいか教えてください。
発生している問題・エラーメッセージ
#エラーメッセージ libEGL warning: DRI2: failed to authenticate QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root' Started Touched Exception in thread Thread-1: Traceback (most recent call last): File "/usr/lib/python3.7/threading.py", line 917, in _bootstrap_inner self.run() File "/usr/lib/python3.7/threading.py", line 865, in run self._target(*self._args, **self._kwargs) File "/home/ada/tamesi/touch_nfc.py", line 50, in run pl.touch = clf.connect(rdwr={'on-connect':self.on}) File "/usr/local/lib/python3.7/dist-packages/nfc/clf/__init__.py", line 581, in connect result = self._rdwr_connect(rdwr_options, terminate) File "/usr/local/lib/python3.7/dist-packages/nfc/clf/__init__.py", line 612, in _rdwr_connect if options['on-connect'](tag): File "/home/ada/tamesi/touch_nfc.py", line 33, in on self.idm = binascii.hexlify(tag._nfcid) AttributeError: 'ClsUsbThread' object has no attribute '_nfcid'
該当のソースコード
touch_nfc.py
#touch_nfc.py import threading import datetime import time import nfc import binascii # ここに上位に通知したいデータを整理して送る class Payload: idm = None touch = None class ClsUsbThread: StopRequest = False # 停止命令 finished = False # 停止完了フラグ callback = None # コールバック関数 th1 = None # スレッドオブジェクト # ----------------------------------------------------- # 初期化 # callback : 結果をメインスレッドに通知する # コールバック関数 # ----------------------------------------------------- def __init__(self, callback, period=0.1): self.callback = callback self.repeat_time = period def on(tag,self): self.idm = binascii.hexlify(tag._nfcid) self.idm = self.idm.decode('utf-8') return self.idm # ----------------------------------------------------- # threadのworker # ----------------------------------------------------- def run(self): while not self.StopRequest: # 終了指示があるまで繰り返し pl = Payload() # USB監視はここで呼び出す clf = nfc.ContactlessFrontend('usb') try: pl.touch = clf.connect(rdwr={'on-connect':self.on}) finally: pl.touch = clf.close() # 結果をまとめてクラスに実装し、Callbackでメインに送り返す if self.callback is not None: # コールバックが指定されていれば通知 self.callback(pl) # 々 time.sleep(self.repeat_time) # 10ms wait self.finished = True # ループが完了したら終わった状態設定 # ----------------------------------------------------- # thread 開始 # ----------------------------------------------------- def start(self): self.th1 = threading.Thread(target=self.run) self.StopRequest = False self.th1.start() print("Started") # ----------------------------------------------------- def stop(self): self.StopRequest = True while True: if self.finished: break self.th1.join() print("Stopped")
#guimain.py from PyQt5.QtWidgets import QApplication, QWidget,QPushButton,QLabel from PyQt5.QtGui import * from PyQt5.QtCore import * import datetime from touch_nfc import ClsUsbThread class ThermoCheck(QWidget): usbthread = None def __init__(self): super().__init__() self.setupUI() def __del__(self): self.stop_proc() def setupUI(self): self.resize(800, 600) self.move(0, 0) self.setWindowTitle('callback test') self.label1 = QLabel(self) self.label1.setGeometry(200, 150, 400, 100) self.label1.setAlignment(Qt.AlignCenter) self.label1.setStyleSheet("font:20pt") self.label1.setText("---") """ self.label2 = QLabel(self) self.label2.setGeometry(200, 250, 400, 100) self.label2.setAlignment(Qt.AlignCenter) self.label2.setStyleSheet("font:20pt") self.label2.setText("---") """ self.button1 = QPushButton(self) self.button1.setText("START") self.button1.setGeometry(320, 380, 80, 30) self.button1.setStyleSheet("font:12pt;font-weight:bold") self.button1.clicked.connect(self.button1_clicked) self.button2 = QPushButton(self) self.button2.setText("STOP") self.button2.setGeometry(420, 380, 80, 30) self.button2.setStyleSheet("font:12pt;font-weight:bold") self.button2.clicked.connect(self.button2_clicked) def button1_clicked(self): self.start_proc() def button2_clicked(self): self.stop_proc() def button3_clicked(self): pass def callback(self, pl): #self.label1.setText(str(pl.count)) self.label2.setText(pl.touch) def start_proc(self): if self.usbthread is not None: self.usbthread = None self.usbthread = ClsUsbThread(self.callback, period=1) self.usbthread.start() def stop_proc(self): if self.usbthread is not None: self.usbthread.stop() del self.usbthread self.usbthread = None
#main.py from PyQt5.QtWidgets import QApplication import sys from guimain import ThermoCheck if __name__ == '__main__': app = QApplication(sys.argv) gui = ThermoCheck() gui.show() app.exec_() gui.stop_proc() sys.exit()
試したこと
read_without_encryptionコマンドを使用してみたのですが下記のエラーが発生してしまいます。
PyQt5nfcpyの相性が悪いのかもしれません。。。
AttributeError: 'ClsUsbThread' object has no attribute 'read_without_encryption'
補足情報(FW/ツールのバージョンなど)
Raspberry Pi ModelB +を利用してIDmを読み取っています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/10 15:40