過去にnfcをTkinterで利用したい
という質問をしました。
これに関係する質問です。
ICカードをかざした時にポップアップ画面を表示したいです。
そこで、下のようにソースコードを書いたのですが、Raspberry Piで動作させた時に、ポップアップ画面の表示位置が指定位置と異なることがあります。(ウィンドウの大きさは指定通りっぽい・・・)
nfcを使わずにポップアップを実装した時はgeometryの指定位置にちゃんと表示されていたので、個人的にはnfcが原因だと思っています。
Windowsではnfcを使っても指定位置に表示されるっぽいので、この現象はRaspberry Piでのみ確認しています。
実際のところどうなのでしょうか?
また、これの対策はできますか?
(もっとも、この質問nfcをTkinterで利用したいが根本的に解決したわけではないので、nfc実装のコードに問題がある可能性はあります・・・)
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 sub_win.destroy() 14 15 def push_clear(): 16 e_id.delete(0, tk.END) 17 18 def push_enter(): 19 input_widget.insert(tk.END, e_id.get()) 20 on_closing() 21 sub_win.destroy() 22 23 def connected(tag): 24 idm = binascii.hexlify(tag.idm) # <class 'byte'> 25 idm = idm.decode() # <class 'str'> 26 e_id.insert(tk.END, idm) 27 # ---------- 今回の実装部分 ここから---------- 28 toplevel = tk.Toplevel() 29 toplevel.geometry("100x100+100+100") # ラズパイだとgeometryの位置指定が効かない? 30 # ---------- 今回の実装部分 ここまで---------- 31 return True # これがないとICを1回かざしたときに複数回認識してしまう 32 33 # カードをかざす度に認識させる 34 def ic_read(): 35 global clf 36 clf = nfc.ContactlessFrontend('usb') 37 while clf.connect(rdwr={ 38 'on-connect': connected, 39 }): 40 pass 41 42 43 def on_closing(): 44 global clf 45 clf.close() 46 thread_nfc.join() 47 48 sub_win = tk.Toplevel() 49 50 thread_nfc = threading.Thread(target=ic_read) 51 thread_nfc.start() 52 53 e_id = tk.Entry(sub_win) 54 e_id.insert(tk.END, input_widget.get()) 55 e_id.grid() 56 57 b_cls = tk.Button(sub_win, text="CLOSE", command=push_close) 58 b_cls.grid() 59 60 b_clr = tk.Button(sub_win, text="CLEAR", command=push_clear) 61 b_clr.grid() 62 63 b_etr = tk.Button(sub_win, text="ENTER", command=push_enter) 64 b_etr.grid() 65
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/01 02:12
2020/09/01 05:45