问题遇到的现象和发生背景
最近用PyQT5和IC卡读卡器做一个考勤系统,结果要先扫IC卡后才会打开GUI界面
问题相关代码,请勿粘贴截图
import binascii
import sys
import time
import nfc
from PyQt5 import QtCore
from PyQt5 import QtWidgets
from PyQt5.QtCore import QFileInfo, QDateTime, QTimer
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QMainWindow
from timecard_GUI import Ui_timecard
class timecard2GUI(QMainWindow, Ui_timecard):
def __init__(self):
super(timecard2GUI, self).__init__()
self.setupUi(self)
self.timer = QTimer()
self.setWindowFlag(Qt.FramelessWindowHint)
self.showFullScreen()
self.timer.timeout.connect(show_time)
self.timer.start(1000)
def show_time():
time_now = QDateTime.currentDateTime() # 获取当前时间
timedisplay = time_now.toString("hh:mm:ss dddd") # 格式化一下时间
# print(timedisplay)
time_form.lbl_showtime.setText(timedisplay)
def show_name(name):
time_form.lbl_showname.setText(name)
class MyCardReader(QMainWindow, Ui_timecard):
def on_connect(self, tag):
# 接触时
print("确认")
# 标签表示
print(tag)
# 读取ID名
self.idm = str(binascii.hexlify(tag._nfcid))
get_id = "IDm : " + self.idm
print(get_id)
time.sleep(1)
show_name(get_id)
def read_id(self):
clf = nfc.ContactlessFrontend('usb')
try:
clf.connect(rdwr={'on-connect': self.on_connect})
finally:
clf.close()
if __name__ == "__main__":
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
app = QtWidgets.QApplication(sys.argv)
time_form = timecard2GUI()
time_form.setWindowTitle('timecard')
time_form.lbl_showname.setText('请放卡')
root = QFileInfo(__file__).absolutePath()
app.setStyle('Fusion')
time_form.show()
cr = MyCardReader()
# 最初表示
print("请放卡")
# 待机
cr.read_id()
# 扫卡后
print("确认")
sys.exit(app.exec_())
运行结果及报错内容
要扫卡后才能显示GUI界面,扫卡只能进行1次
我的解答思路和尝试过的方法
完全没有编程经验,搜了一下好像有异步处理和多线程两种方法,具体代码怎么弄没有头绪
我想要达到的结果
GUI的lbl_showtime用来实时显示时间,lbl_showname在待机时显示“请放卡”,在扫描到IC卡后输出IC卡的ID,读卡器程序始终循环