この記事は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()
#実行結果
doyo-noteと書き込んだNFCタグを近づけると、このように表示されました。