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

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

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

無線通信

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

1回答

2369閲覧

nfcをPyQt5のラベルに表示したい。

ada39

総合スコア1

NFC

無線通信

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2020/12/10 14:50

編集2020/12/10 15:11

前提・実現したいこと

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を読み取っています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラー原因についてはメソッドの引数が逆になってます。

python

1 def on(tag,self): 2

スレッドの callback について、GUI操作 (ラベルのテキスト更新) は、
必ずイベントループを実行しているメインスレッド側で行う必要があります。
(※ 関数が所属してるクラスではなく、実行時のスレッド)

エラーは出ないことも有りますが、スレッドセーフではないので誤動作の原因に成り得ます。
(一見正常に動いてるように見えても、タイミング次第でエラーが起こる等、不安定な要素の原因)

Qt の場合は、シグナル&スロットを使って別スレッドからの通知を行えるので、
QThread の利用を検討して見て下さい。

投稿2020/12/10 15:24

編集2020/12/10 15:26
teamikl

総合スコア8664

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

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

ada39

2020/12/10 15:40

回答ありがとうございます!! 引数を逆にしたところエラーを吐かなくなりました!! 良ければまたよろしくお願いします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問