LoginSignup
0
0

More than 1 year has passed since last update.

Python:NFCとtkinter(穴埋め式)

Last updated at Posted at 2022-02-15

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

tkinter & nfcpy

tkinterでnfcタグの内容を読み取ろうとするとうまく動きませんでした。
おそらく、nfcpyの読み取りで待ってしまうので、タイムアウトを設定しないといけないっぽい。
nfcpyにおけるタイムアウト処理を参考に下記のように一応解決できました。

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_reader.Reader()でNFCリーダーをインスタンス化
        #self.my_nfc_readerというメンバ変数にインスタンスを入れてください。

        # ------------------------------------------
        #②インスタンスのcheck_loopというメソッドをスレッドの対象に設定

        # ------------------------------------------
        #③スレッドをスタート

        # ------------------------------------------
        self.update_label()
        self.root.mainloop()

    def update_label(self):
        try:
            #self.my_nfc_readerのonというメンバ変数がTrueなら内容を表示
            if self.my_nfc_reader.on==True:
                self.labe_text.set(self.my_nfc_reader.txt)
                print("on")
            #self.my_nfc_readerのonというメンバ変数がFalseならタッチしてくださいと表示
            else:
                self.labe_text.set("タッチしてください")
                print("off")
        except:
            self.labe_text.set("ボタンを押してください")
        self.root.after(100, self.update_label)

app=Display()
0
0
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
0
0