簡體   English   中英

如何在wxPython GUI應用程序上運行nfcpy讀卡器系統

[英]how to run nfcpy card reader system on wxPython GUI application

我是wxPython GUI應用程序的新手

我想將我的python腳本創建為GUI應用程序

這是我的示例腳本

import binascii
import nfc

class MyCardReader(object):

   def on_connect(self, tag):
      print "touched"
      self.idm = binascii.hexlify(tag.idm)
      return True

   def read_id(self):
      clf = nfc.ContactlessFrontend('usb')
      try:
         clf.connect(rdwr={'on-connect': self.on_connect})
      finally:
         clf.close()

if __name__ == '__main__':
  cr = MyCardReader()
  while True:
    print "touch card:"
    cr.read_id()
    print "released"
    print cr.idm

如何使用wxPython將上述腳本作為GUI應用程序運行,我已經嘗試過了,但是沒有用,我的代碼有什么問題。

#-*- encoding: utf-8 -*-
import wx
import nfc
import binascii
class MyFrame(wx.Frame):

   def __init__(self, parent, title):
      wx.Frame.__init__(self, parent, title=title, size=(400, 500))
      panel = wx.Panel(self)
      self.Show(True)
      while True:
        clf = nfc.ContactlessFrontend('usb')
        clf.connect(rdwr={'on-connect': self.on_connect})
        self.text = wx.StaticText(panel, label='i want to print the return value here', pos=(100, 100))

  def on_connect(self, tag):
      self.idm = binascii.hexlify(tag.idm)
      return self.idm

app = wx.App(False)
frame = MyFrame(None, 'card reader app')
app.MainLoop()

nfc.ContactlessFrontend.connect()方法在調用者線程上下文中運行,因此至少在連接標簽之前不會返回(並且如果“ on-connect”回調返回True,它將進一步等待標簽消失)。 wx.App.mainLoop()也在調用程序線程上下文中運行以調度窗口事件。 因此,正確的方法是在單獨的線程中運行標簽發現,並將事件發送到渲染幀。 以下示例顯示了標簽靠近閱讀器時的標簽標識符。

#!/usr/bin/env python
import wx
import wx.lib.newevent
import nfc
import threading
from binascii import hexlify

ShowCardEvent, SHOW_CARD_EVENT = wx.lib.newevent.NewEvent()
GoneCardEvent, GONE_CARD_EVENT = wx.lib.newevent.NewEvent()


class TagReader(threading.Thread):
    def __init__(self, wx_frame):
        super(TagReader, self).__init__(name="TagReader")
        self.terminate = False
        self.wx_frame = wx_frame

    def run(self):
        clf = nfc.ContactlessFrontend('usb')
        rdwr_options = {
            'on-connect': self.on_tag_connect,
            'on-release': self.on_tag_release
        }
        while not self.terminate:
            clf.connect(rdwr=rdwr_options, terminate=lambda: self.terminate)

    def on_tag_connect(self, tag):
        wx.PostEvent(self.wx_frame, ShowCardEvent(tag=tag))
        return True

    def on_tag_release(self, tag):
        wx.PostEvent(self.wx_frame, GoneCardEvent())


class Frame(wx.Frame):
    def __init__(self, title):
        super(Frame, self).__init__(None, title=title, size=(500, 200))
        self.text = wx.StaticText(wx.Panel(self), pos=(100, 100))
        self.Bind(SHOW_CARD_EVENT, self.show_card_event)
        self.Bind(GONE_CARD_EVENT, self.gone_card_event)
        self.Bind(wx.EVT_CLOSE, self.close_window_event)
        wx.PostEvent(self, GoneCardEvent())
        self.Show()

    def close_window_event(self, event):
        self.Destroy()

    def show_card_event(self, event):
        self.text.SetLabel("Card ID {}".format(hexlify(event.tag.identifier)))

    def gone_card_event(self, event):
        self.text.SetLabel("no card")


app = wx.App()
reader = TagReader(Frame('card reader app'))
reader.start()
app.MainLoop()
reader.terminate = True  # tell the reader to terminate
reader.join()  # and wait for the reader thread to finish

您已將代碼放入無盡的While True循環中,這意味着Gui主循環永遠不會運行。
您應該基於來自讀卡器的輸入來添加event ,或者要開始使用,只需添加一個按鈕並在按下按鈕時訪問讀卡器即可。 這將使您快速啟動並運行。
這是您的代碼,經過調整可在我的計算機上使用,僅用於證明它可以正常工作。
注意self.text.SetLabel()的使用

import wx
#import nfc
import binascii
class MyFrame(wx.Frame):

    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(400, 500))
        panel = wx.Panel(self)
        self.text = wx.StaticText(panel, label='i want to print the return value here', pos=(100, 100))
        self.read = wx.Button(panel, -1, label="Read Card", pos=(100, 200))
        self.read.Bind(wx.EVT_BUTTON, self.on_button)
        self.Show()
        self.n = 0

    def on_button(self,event):
#        clf = nfc.ContactlessFrontend('usb')
#        clf.connect(rdwr={'on-connect': self.on_connect})
        self.n+=1
        self.on_connect("abc")
        self.text.SetLabel("Card Value "+self.idm+" "+str(self.n))

    def on_connect(self, tag):
        self.idm = binascii.hexlify(tag)#.idm)
        return self.idm

app = wx.App()
frame = MyFrame(None, 'card reader app')
app.MainLoop()

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM