tkinterのテキストボックスにICのIDを入力したい。
ICリーダはRC-S380を使用。
ICは1回読めればいいです。もう1回かざしなおしても読み取らなくていいです。
自分なりに考えて下のようになりました。
上手く動作しないので、どこをどう直せばよいか教えてください。
(ICを読み込ませずにウィンドウを閉じようとすると、閉じるまでに時間がかかりそれまではフリーズ状態)
Python
1import nfc 2import tkinter as tk 3import binascii 4import threading 5 6def push_clear(): 7 e_id.delete(0, tk.END) 8 9def push_enter(): 10 print(e_id.get()) 11 e_id.delete(0, tk.END) 12 13def ic_read(): 14 global clf # on_close() でも扱うことがあるため 15 clf = nfc.ContactlessFrontend("usb") # 接続 16 try: 17 clf.connect( rdwr={"on-connect": connected} ) # 認識 18 finally: 19 clf.close() # 切断 20 21def connected(tag): 22 idm = binascii.hexlify(tag.idm) # <class 'byte'> 23 idm = idm.decode() # <class 'str'> 24 e_id.insert(tk.END, idm) 25 return True 26 27def on_closing(): 28 global clf 29 clf.close() # ICを読み込まずにウィンドウを閉じようとするときに、これがないとフリーズではなく応答なしになってしまう 30 thread_nfc.join() 31 win.destroy() 32 33if __name__ == "__main__": 34 thread_nfc = threading.Thread(target=ic_read) 35 thread_nfc.start() 36 37 win = tk.Tk() 38 39 e_id = tk.Entry(win) 40 e_id.grid() 41 42 b_clr = tk.Button(win, text="CLEAR", command=push_clear) 43 b_clr.grid() 44 45 b_ent = tk.Button(win, text="ENTER", command=push_enter) 46 b_ent.grid() 47 48 win.protocol("WM_DELETE_WINDOW", on_closing) 49 win.mainloop()
修正(ソースの間違い)
Python
1# main.py 2 3import tkinter as tk 4 5import input_ic 6 7 8def push_enter(): 9 print(e_id.get()) 10 e_id.delete(0, tk.END) 11 12 13def push_entry(e, e_id): 14 input_ic.input_ic(e, e_id) 15 16 17if __name__ == "__main__": 18 win = tk.Tk() 19 20 e_id = tk.Entry(win) 21 e_id.grid() 22 23 b_etr = tk.Button(win, text="ENTER", command=push_enter) 24 b_etr.grid() 25 26 e_id.bind("<Button-1>", lambda e:push_entry(e, e_id)) 27 28 win.mainloop()
Python
1# input_ic.py 2 3import nfc 4import tkinter as tk 5import binascii 6import threading 7 8 9def input_ic(e, input_widget): 10 11 def push_close(): 12 on_closing() 13 14 def push_clear(): 15 e_id.delete(0, tk.END) 16 17 def push_enter(): 18 input_widget.insert(tk.END, e_id.get()) 19 on_closing() 20 21 def connected(tag): 22 idm = binascii.hexlify(tag.idm) # <class 'byte'> 23 idm = idm.decode() # <class 'str'> 24 e_id.insert(tk.END, idm) 25 return True # これがないとICを1回かざしたときに複数回認識してしまう(whileループ時) 26 27 def ic_read(): 28 global clf 29 clf = nfc.ContactlessFrontend("usb") # 接続 30 try: 31 clf.connect( rdwr={"on-connect": connected} ) # 認識 32 finally: 33 clf.close() # 切断 34 35 def on_closing(): 36 global clf 37 clf.close() # これがないと応答なしになってしまう 38 thread_nfc.join() 39 sub_win.destroy() 40 41 sub_win = tk.Toplevel() 42 43 thread_nfc = threading.Thread(target=ic_read) 44 thread_nfc.start() 45 46 e_id = tk.Entry(sub_win) 47 e_id.insert(tk.END, input_widget.get()) 48 e_id.grid() 49 50 b_cls = tk.Button(sub_win, text="CLOSE", command=push_close) 51 b_cls.grid() 52 53 b_clr = tk.Button(sub_win, text="CLEAR", command=push_clear) 54 b_clr.grid() 55 56 b_etr = tk.Button(sub_win, text="ENTER", command=push_enter) 57 b_etr.grid() 58 59 sub_win.protocol("WM_DELETE_WINDOW", on_closing)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/28 10:51
2020/02/28 10:59
2020/02/29 20:30 編集
2020/03/02 13:21
2020/03/02 15:01
2020/03/17 11:05 編集
2020/03/18 04:39