2
3

More than 1 year has passed since last update.

Python:NFCとtkinter

Last updated at Posted at 2022-02-13

この記事はpythonでNFCカード等を読み取れていることを前提にした記事です。
読み取りの準備等はPython:NFCを参考にしてください。

tkinter & nfcpy

tkinterでnfcタグの内容を読み取ろうとするとうまく動きませんでした。そこで、スレッドを使って並列処理で対処します。

nfc_reader.py

nfc_reader.pyという名前のファイルを作って、下記のプログラムをコピペしてください。
NFCタグのレコードを読み取るプログラムです。

#nfc_reader.py

import nfc

class Reader():
    def __init__(self):
        # 表示用
        self.on = False
        self.txt = ''

    def on_connect(self, tag):
        self.on = True
        try:
            self.records = tag.ndef.records
            self.txt = self.records[0].text
        except:
            pass
        return True

    def on_release(self, tag):
        self.on = False
        # self.txt = "タッチしてください"
        return True

    def __call__(self):
        clf = nfc.ContactlessFrontend('usb')
        try:
            clf.connect(rdwr= {'on-connect': self.on_connect,'on-release': self.on_release})
        finally:
            clf.close()

    def check_loop(self):
        while True:
            self.__call__()

main.py

nfc_reader.pyと同じディレクトリにmain.pyをつくり、下記のプログラムをコピペしてください。

#main.py
import tkinter as tk
import time
import threading
import nfc_reader

class Display():
    def __init__(self):
        self.root = tk.Tk()
        # ラベルの設定--------------------------------
        self.labe_text = tk.StringVar()
        self.labe_text.set("表示ラベル")
        self.label = tk.Label(textvariable=self.labe_text, font=('Helvetica', 48))
        # ------------------------------------------
        self.label.pack()
        # NFCリーダーをチェックするスレッド
        self.reader_thread_start()
        self.update_label()
        self.root.mainloop()

    def reader_thread_start(self):
        self.my_nfc_reader = nfc_reader.Reader()
        self.reader_thread = threading.Thread(target=self.my_nfc_reader.check_loop)
        self.reader_thread.start()
        self.labe_text.set("タッチしてください")

    def update_label(self):
        try:
            if self.my_nfc_reader.on==True:
                self.labe_text.set(self.my_nfc_reader.txt)
                print("on")
            else:
                self.labe_text.set("タッチしてください")
                print("off")
        except:
            self.labe_text.set("ボタンを押してください")
        self.root.after(100, self.update_label)

app=Display()

実行結果

スクリーンショット 2022-02-13 10.54.32.png

doyo-noteと書き込んだNFCタグを近づけると、このように表示されました。

スクリーンショット 2022-02-13 10.54.41.png

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3