Python nfcpy:Can';不要逃避使用nfcpy持续收听的while循环

Python nfcpy:Can';不要逃避使用nfcpy持续收听的while循环,python,nfc,keyboardinterrupt,Python,Nfc,Keyboardinterrupt,我目前有一个python脚本,当标签通过ACR122U读取器时,我使用nfcpy侦听和处理该脚本。最终目标是在扫描标记时侦听并键入标记的UID。我已经让那部分工作了 我遇到的问题是,为了使程序在扫描第一个标记后不结束,我将以下行包围起来-这将启动读卡器并使其侦听标记-包围在while true循环中: 将nfc.无触点前端(“usb”)作为clf: tag=clf.connect(rdwr=rdwr_选项) 但是,在程序等待标记时,点击^C不会使程序退出。当上述行没有被while循环包围时,它可

我目前有一个python脚本,当标签通过ACR122U读取器时,我使用nfcpy侦听和处理该脚本。最终目标是在扫描标记时侦听并键入标记的UID。我已经让那部分工作了

我遇到的问题是,为了使程序在扫描第一个标记后不结束,我将以下行包围起来-这将启动读卡器并使其侦听标记-包围在
while true
循环中:

将nfc.无触点前端(“usb”)作为clf:
tag=clf.connect(rdwr=rdwr_选项)

但是,在程序等待标记时,点击
^C
不会使程序退出。当上述行没有被while循环包围时,它可以终止程序

我试着将它包装在
try
块中,并添加一个键盘中断异常,但这没有任何作用

以下是我目前的代码:

import nfc
import time
import os

def typestr(text,returnatend):
    totype = text
    if returnatend=="false":
        cmd = """osascript -e 'tell application "System Events"' -e 'delay 0.1' -e 'keystroke "%s"' -e 'end tell' -e 'delay 2.0'""" % totype
    else:
        cmd = """osascript -e 'tell application "System Events"' -e 'delay 0.1' -e 'keystroke "%s"' -e 'delay 0.1' -e 'key code 36' -e 'end tell' -e 'delay 2.0'""" % totype

    os.system(cmd)

def notification_osx(text,title,subtitle):
    cmd = """osascript -e 'display notification "%s" with title "%s" subtitle "%s"'""" % (text, title, subtitle)
    os.system(cmd)

def on_startup(targets):
    for target in targets:
        target.sensf_req = bytearray.fromhex("0012FC0000")
    return targets

def on_connect(tag):
    print("printing tag")
    print(tag)
    print("printing uid")
    uid = str(tag.identifier).encode("hex").upper()
    typestr(uid,"false")
    notification_osx(uid,"Scanned Card", "Scanned a card with ID:")


rdwr_options = {
    'on-startup': on_startup,
    'on-connect': on_connect,
    'beep-on-connect': False,
}

while True:
    with nfc.ContactlessFrontend('usb') as clf:
        tag = clf.connect(rdwr=rdwr_options)

当使用Ctrl-C中断时,
clf.connect
方法返回
False
。如果
标记为False,则代码应计算返回值并中断循环。这记录在描述末尾的返回值下。

当使用Ctrl-C中断时,
clf.connect
方法返回
False
。如果
标记为False,代码应计算返回值并中断循环。这记录在描述末尾的返回值下。

提供一个。@aryamccarthy添加了我的源代码,它非常小。提供一个。@aryamccarthy添加了我的源代码,它非常小。嗨,Stephen,谢谢你的帮助。我已经像这样实现了你的建议:
而True:nfc.ContactlessFrontend('usb')作为clf:tag=clf.connect(rdwr=rdwr_选项)如果tag==False:break
,但是当我这样做时,需要按两下
^C
键才能退出,但前提是标签已经被扫描过。好奇您是否有任何想法?系统地排除其他因素可能会带来进一步的见解。请尝试禁用osascript命令调用,以查看这是否会产生影响。请注意,如果不希望在同一标记靠近读取器时反复识别该标记,则on_connect应返回True。请参阅Hi Stephen上的文档,谢谢您的帮助。我已经像这样实现了你的建议:
而True:nfc.ContactlessFrontend('usb')作为clf:tag=clf.connect(rdwr=rdwr_选项)如果tag==False:break
,但是当我这样做时,需要按两下
^C
键才能退出,但前提是标签已经被扫描过。好奇您是否有任何想法?系统地排除其他因素可能会带来进一步的见解。请尝试禁用osascript命令调用,以查看这是否会产生影响。请注意,如果不希望在同一标记靠近读取器时反复识别该标记,则on_connect应返回True。请参阅位于的文档