この記事は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()