Python读写文本URL蓝牙WIFI自动连接电子名片位置坐标智能海报等NDEF标签

本示例使用的发卡器:https://item.taobao.com/item.htm?id=615391857885&spm=a1z10.5-c.w4002-21818769070.11.60ad789erlonvk         
        近场通信(Near Field Communication,简称NFC),是一种新兴的技术,使用了NFC技术的设备(例如移动电话)可以在彼此靠近的情况下进行数据交换,是由非接触式射频识别(RFID)及互连互通技术整合演变而来的,通过在单一芯片上集成感应式读卡器、感应式卡片和点对点通信的功能,利用移动终端实现移动支付、电子票务、门禁、移动身份识别、防伪等应用。近场通信技术是由诺基亚(Nokia)、飞利浦(Philips)和索尼(Sony)共同制定的标准 ,在ISO 18092、ECMA 340和ETSI TS 102 190框架下推动标准化,同时也兼容应用广泛的ISO 14443 、Type-A、ISO 15693、B以及Felica标准非接触式智能卡 的基础架构。

       NDEF 全称 NFC data exchange format 即 nfc 数据交换格式,是一种标准化的数据格式,可用于在任何兼容的NFC设备与另一个NFC设备或标签之间交换信息。数据格式由NDEF消息和NDEF记录组成 。

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget,QMessageBox
from PyQt5.QtGui import QFont
from NDEFTagTools import Ui_Frame
import sys
import struct  # struct的pack函数把任意数据类型变成字符串
import ctypes  # 调用DLL动态库要有这个引用#'为防止测试时忘记卡片密码,本系统统一使用密码为 197402020111 ,MifareClassic的密码6字节 ,forumtype2标签的密码是前4个字节,密码为 19740202
oldpicckey = bytes.fromhex('197402020111')
newpicckey = bytes.fromhex('197402020111')class MainWindow(QtWidgets.QMainWindow, Ui_Frame):def __init__(self, parent=None):super(MainWindow, self).__init__(parent)self.setupUi(self)self.pushButton_clearinf.clicked.connect(self.pushButton_clearinf_clicked)self.pushButton_beep.clicked.connect(self.pushButton_beep_clicked)self.pushButton_getdevnum.clicked.connect(self.pushButton_getdevnum_clicked)self.pushButton_clearbuff.clicked.connect(self.pushButton_clearbuff_clicked)self.pushButton_writetag.clicked.connect(self.pushButton_writetag_clicked)self.comboBox_seleapp.currentTextChanged.connect(self.comboBox_seleapp_currentindexchanged)self.pushButton_text.clicked.connect(self.pushButton_text_clicked)self.pushButton_App.clicked.connect(self.pushButton_App_clicked)self.pushButton_Url.clicked.connect(self.pushButton_Url_clicked)self.pushButton_Map.clicked.connect(self.pushButton_Map_clicked)self.pushButton_Bluetooth.clicked.connect(self.pushButton_Bluetooth_clicked)self.pushButton_Wifi.clicked.connect(self.pushButton_Wifi_clicked)self.pushButton_Card.clicked.connect(self.pushButton_Card_clicked)self.pushButton_Data.clicked.connect(self.pushButton_Data_clicked)self.pushButton_Call.clicked.connect(self.pushButton_Call_clicked)self.pushButton_readtag.clicked.connect(self.pushButton_readtag_clicked)self.pushButton_cleatag.clicked.connect(self.pushButton_cleatag_clicked)self.checkBox_later.toggled.connect(self.checkBox_later_toggled)def pushButton_clearinf_clicked(self):self.listWidget.clear()self.plainTextEdit_taginf.setPlainText('')def checkBox_later_toggled(self):if self.checkBox_later.isChecked():answ=QMessageBox.warning(self,'警告','      ISO15693协议标签锁定保护后就不能再解锁修改!请问确定要开启锁定保护功能吗?',QMessageBox.Yes|QMessageBox.No)if answ==QMessageBox.No:self.checkBox_later.setChecked(False)def ListErrInf(self,Errcode):if (Errcode == 8):self.ListBottom('错误代码:8,未寻到卡,请重新拿开卡后再放到感应区!')elif (Errcode == 1):self.ListBottom('错误代码:1,0~2块都没读出来,可能刷卡太块。但卡序列号已被读出来!')elif (Errcode == 2):self.ListBottom('错误代码:2,第0块已被读出,但1~2块读取失败。卡序列号已被读出来!')elif (Errcode == 3):self.ListBottom('错误代码:3,第0、1块已被读出,但2块读取失败。卡序列号已被读出来!')elif (Errcode == 9):self.ListBottom('错误代码:9,有多张卡在感应区,寻卡过程中防冲突失败,读序列吗错误!')elif (Errcode == 10):self.ListBottom('错误代码:10,该卡可能已被休眠,无法选中卡片!')elif (Errcode == 11):self.ListBottom('错误代码:11,密码装载失败!')elif (Errcode == 12):self.ListBottom('错误代码:12,标签密码认证错误!')elif (Errcode == 13):self.ListBottom('错误代码:13,读指定块失败,原因是刷卡太快或本块所对应的区还没通过密码认证!')elif (Errcode == 14):self.ListBottom('错误代码:14,写标签失败,可能需要验证密码!')elif (Errcode == 21):self.ListBottom('错误代码:21,没有动态库!')elif (Errcode == 22):self.ListBottom('错误代码:22,动态库或驱动程序异常!')elif (Errcode == 23):self.ListBottom('错误代码:23,(表示未检测到免驱动读写器!)(有驱动读写器表示驱动程序错误或未检测到有驱读写器!)')elif (Errcode == 24):self.ListBottom('错误代码:24,操作超时,一般是动态库没有反映!')elif (Errcode == 25):self.ListBottom('错误代码:25,发送字数不够!')elif (Errcode == 26):self.ListBottom('错误代码:26,发送的CRC错!')elif (Errcode == 27):self.ListBottom('错误代码:27,接收的字数不够!')elif (Errcode == 28):self.ListBottom('错误代码:28,接收的CRC错!')elif (Errcode == 45):self.ListBottom('错误代码:45,此卡不支持更改UID号或UID块已被锁定!')elif (Errcode == 46):self.ListBottom('错误代码:46,标签存储空间不足!')elif (Errcode == 254):self.ListBottom('错误代码:254,标签存储空间不足!')elif (Errcode == 255):self.ListBottom('错误代码:255,暂不支持长度大于255字节的信息写入!')else:self.ListBottom('未知错误,错误代码:' + str(Errcode))def comboBox_seleapp_currentindexchanged(self):packstr=self.comboBox_seleapp.currentText().strip()FieldsList = packstr.split('|')self.lineEdit_appname.setText(FieldsList[1])def ListBottom(self,dispinf):if self.listWidget.count()>50:self.listWidget.clear()self.listWidget.addItem(dispinf)self.listWidget.scrollToBottom()seleid = self.listWidget.count() - 1self.listWidget.item(seleid).setSelected(True)def pushButton_beep_clicked(self):status = Objdll.pcdbeep(50) % 256if status == 0:self.ListBottom("读写器已执行响声指令!")else:self.ListErrInf(status)def pushButton_getdevnum_clicked(self):devno = bytes(4)  # 声明4个字节缓冲status = Objdll.pcdgetdevicenumber(devno) % 256if (status == 0):Objdll.pcdbeep(38)SerialNum = ''for num in range(0, len(devno)):SerialNum = SerialNum + '%03d' % (devno[num])if (num < len(devno) - 1):SerialNum = SerialNum + '-'self.ListBottom('读取设备编号成功,设备编号:' + SerialNum)else:self.ListErrInf(status)def pushButton_clearbuff_clicked(self):Objdll.tagbuf_forumtype4_clear()Objdll.tagbuf_clear()self.ListBottom('NDEF写卡缓冲区数据清除成功!' )def checkcardtype(self):        #检测NFC标签类型myctrlword=0devno = bytes(4)        # 声明4个字节缓冲mypiccserial= bytes(8)  # 声明8个字节缓冲mypicckey=bytes(6)      # 声明6个字节缓冲mypicdata=bytes(48)mypiccseriallen=bytes(2)try:status = Objdll.pcdgetdevicenumber(devno) % 256if (status == 0):status = Objdll.piccreadex_ntag(myctrlword, mypiccserial, mypicckey, 4, 1, mypicdata) % 256if (status == 0):return 1        #forumtype2 Ntag2标签else:status = Objdll.iso15693readex(myctrlword,0,1,1, mypiccserial,mypicdata) % 256if (status == 0):return 2    #forumtype5 15693标签else:myctrlword = 23mypicckey=bytes([255,255,255,255,255,255])status = Objdll.piccreadex(myctrlword,mypiccserial,0,1,mypicckey,mypicdata) % 256if (status == 0):return 3    #MifareClissic标签,出厂全新状态else:mypicckey = bytes([160, 161, 162, 163, 164, 165])status = Objdll.piccreadex(myctrlword, mypiccserial, 0, 1, mypicckey, mypicdata) % 256if (status == 0):return 3        #MifareClissic标签,已经写有NDEF数据else:myctrlword = 0status = Objdll.forumtype4request(myctrlword, mypiccserial, mypiccseriallen) % 256if (status == 0 or status == 52):return 4    #forumtype4 标签else:return -1   #其他未知型号标签else:return 23   #未连接到发卡器except:return 23def WriteTag(self,funcname):     #将NDEF缓冲区数据写入各种不同类型的NFC标签,清除标签内NDEF数据mypiccserial = bytes(8)mypiccseriallen=bytes(1)try:cardtyep = self.checkcardtype()  #判断发卡器上的标签类型if(cardtyep==1):        #写forumtype2 Ntag2标签if self.checkBox_before.isChecked():myctrlword = 16else:myctrlword = 0status = Objdll.forumtype2_write_ndeftag(myctrlword, mypiccserial, oldpicckey) % 256if (status == 0):Objdll.pcdbeep(38)cardno = 'ForumType2,UID:'for num in range(0, 7):cardno = cardno + '%02X' % (mypiccserial[num])self.ListBottom('NDEF缓冲区数据写入标签成功!标签类型:'+cardno)if (self.checkBox_before.isChecked() and not self.checkBox_later.isChecked()) or (not self.checkBox_before.isChecked() and self.checkBox_later.isChecked() or (self.checkBox_before.isChecked() and self.checkBox_later.isChecked())):self.NtagkeyEn()else:self.ListErrInf(status)elif(cardtyep==2):       #写forumtype5 15693标签myctrlword = 0afi=0status = Objdll.forumtype5_write_ndeftag(myctrlword,afi, mypiccserial) % 256if (status == 0):Objdll.pcdbeep(38)cardno = 'ForumType5,UID:'for num in range(0, 8):cardno = cardno + '%02X' % (mypiccserial[num])if self.checkBox_later.isChecked():    #15693卡锁定块数据后只能读取不可再修改,为防止卡片锁死,请谨慎锁定Objdll.iso15693lockblock(0,1,mypiccserial)self.ListBottom('NDEF缓冲区数据写入标签成功!标签类型:' + cardno)else:self.ListErrInf(status)elif (cardtyep == 3):  # 写MifareClassic标签if(funcname=='NDEF_Clear'):if self.checkBox_before.isChecked():myctrlword = 210else:myctrlword = 146status = Objdll.piccclear_ndeftag(myctrlword, mypiccserial, oldpicckey) % 256else:if self.checkBox_before.isChecked():myctrlword = 210else:myctrlword = 146if self.checkBox_later.isChecked():  #写标签后给标签加密保护myctrlword=myctrlword+4status = Objdll.piccwrite_ndeftag(myctrlword, mypiccserial, oldpicckey,newpicckey) % 256if (status == 0):Objdll.pcdbeep(38)cardno = 'MifareClass,UID:'for num in range(0, 4):cardno = cardno + '%02X' % (mypiccserial[num])self.ListBottom('NDEF缓冲区数据写入标签成功!标签类型:' + cardno)else:self.ListErrInf(status)elif(cardtyep==4):       #写forumtype4 标签if self.checkBox_before.isChecked():myctrlword = 64else:myctrlword = 0status = Objdll.forumtype4_write_ndeftag(myctrlword, mypiccserial,mypiccseriallen,newpicckey) % 256if (status == 0):Objdll.pcdbeep(38)cardno = 'ForumType4,UID:'for num in range(0, mypiccseriallen[0]):cardno = cardno + '%02X' % (mypiccserial[num])self.ListBottom('NDEF缓冲区数据写入标签成功!标签类型:' + cardno)else:self.ListErrInf(status)elif (cardtyep == 23):self.ListErrInf(23)else:self.ListErrInf(8)except:self.ListErrInf(8)def ReadTag(self,funcname):      # 读取各种不同类型的NFC标签的NDEF数据mypiccserial = bytes(8)mypiccseriallen = bytes(1)mypiccdata = bytes(2048)revstrlen = bytes(2)recordnumber = bytes(2)try:cardtyep = self.checkcardtype()  #判断发卡器上的标签类型if (cardtyep == 1):         # 读forumtype2 Ntag2标签if self.checkBox_before.isChecked():myctrlword = 16else:myctrlword = 0status = Objdll.forumtype2_read_ndeftag(myctrlword, mypiccserial, oldpicckey) % 256if(status==0):Objdll.pcdbeep(38)cardno = 'ForumType2,UID:'for num in range(0, 7):cardno = cardno + '%02X' % (mypiccserial[num])self.ListBottom('读取NDEF标签数据成功!标签类型:' + cardno)else:self.ListErrInf(status)elif(cardtyep==2):       #读forumtype5 15693标签myctrlword = 0afi=0status = Objdll.forumtype5_read_ndeftag(myctrlword,afi, mypiccserial) % 256if (status == 0):Objdll.pcdbeep(38)cardno = 'ForumType5,'for num in range(0, 8):cardno = cardno + '%02X' % (mypiccserial[num])self.ListBottom('读取NDEF标签数据成功!标签类型:' + cardno)else:self.ListErrInf(status)elif (cardtyep == 3):  # 读MifareClassic标签if self.checkBox_before.isChecked():myctrlword = 208else:myctrlword = 144status = Objdll.piccread_ndeftag(myctrlword, mypiccserial, oldpicckey) % 256if (status == 0):Objdll.pcdbeep(38)cardno = 'MifareClass,'for num in range(0, 4):cardno = cardno + '%02X' % (mypiccserial[num])self.ListBottom('读取NDEF标签数据成功!标签类型:' + cardno)else:self.ListErrInf(status)elif(cardtyep==4):       #读forumtype4 标签if self.checkBox_before.isChecked():myctrlword = 64else:myctrlword = 0status = Objdll.forumtype4_read_ndeftag(myctrlword, mypiccserial,mypiccseriallen,oldpicckey) % 256if (status == 0):Objdll.pcdbeep(38)cardno = 'ForumType4,'for num in range(0, mypiccseriallen[0]):cardno = cardno + '%02X' % (mypiccserial[num])self.ListBottom('读取NDEF标签数据成功!标签类型:' + cardno)else:self.ListErrInf(status)elif (cardtyep == 23):self.ListErrInf(23)else:self.ListErrInf(8)if (status == 0):Objdll.tagbuf_read(mypiccdata,revstrlen,recordnumber)strlen=revstrlen[0]+revstrlen[1]*256strinf=mypiccdata[0:strlen]ndefstr=strinf.decode('gbk')self.plainTextEdit_taginf.setPlainText(ndefstr)except:self.ListErrInf(8)def NtagkeyEn(self):    #开启或关闭Ntag标签的密钥保护功能mypiccserial=bytes(8)if self.checkBox_before.isChecked():    #操作已经加密保护的ntag2x卡myctrlword=16else:myctrlword=0if self.checkBox_later.isChecked(): #需要开启Ntag卡的加密保护功能mypiccdata=bytes.fromhex('0000000400000000')mypiccdata=mypiccdata + newpicckey[0:4]mypiccdata = mypiccdata +bytes.fromhex('16160000')myctrlword=myctrlword+7status = Objdll.piccinit_ntag(myctrlword, mypiccserial, oldpicckey, mypiccdata)if status == 0:cardno = 'ForumType2,UID:'for num in range(0, 7):cardno = cardno + '%02X' % (mypiccserial[num])self.ListBottom('NDEF标签加密锁定保护成功!标签类型:' + cardno)else:self.ListBottom('NDEF标签加密锁定保护失败!错误代码%d:' %(status))else:mypiccdata = bytes.fromhex('000000FF000000000000000000000000')      #关闭Ntag卡的密钥保护功能myctrlword = myctrlword + 3status=Objdll.piccinit_ntag(myctrlword,mypiccserial,oldpicckey,mypiccdata)if status == 0:cardno = 'ForumType2,UID:'for num in range(0, 7):cardno = cardno + '%02X' % (mypiccserial[num])self.ListBottom('NDEF标签解密去除锁定保护成功!标签类型:' + cardno)else:self.ListBottom('NDEF标签解密去除锁定保护失败!错误代码%d:' %(status))def pushButton_writetag_clicked(self):self.WriteTag('NDEF缓冲区数据')def pushButton_text_clicked(self):languagecodestr = "en".encode('gbk')textstr=self.lineEdit_text.text().strip().encode('gbk')if len(textstr)<1:QMessageBox.critical(self,'提示','请输入要加入写卡缓冲区的文本信息!',QMessageBox.Yes)self.lineEdit_text.setFocus()returnelse:status = Objdll.tagbuf_addtext(languagecodestr, len(languagecodestr), textstr, len(textstr)) % 256if status == 0:self.ListBottom("文本信息加入NDEF写卡缓冲区成功,可继续添加标签信息到缓冲区,也可以将缓冲区现有信息写入标签!")else:self.ListBottom("文本信息加入NDEF写卡缓冲区失败!")def pushButton_App_clicked(self):packagestr = self.lineEdit_appname.text().strip().encode('gbk')if len(packagestr)<1:QMessageBox.critical(self,'提示','请输入要加入写卡缓冲区的自启动APP程序包名!',QMessageBox.Yes)self.lineEdit_appname.setFocus()returnelse:status = Objdll.tagbuf_addapp(packagestr, len(packagestr)) % 256if status == 0:self.ListBottom("自启动APP名称加入NDEF写卡缓冲区成功,可继续添加标签信息到缓冲区,也可以将缓冲区现有信息写入标签!")else:self.ListBottom("自启动APP名称加入NDEF写卡缓冲区失败!")def pushButton_Url_clicked(self):languagecodestr = "en".encode('gbk')titlestr=self.lineEdit_title.text().strip().encode('gbk')uriheaderindex = self.comboBox_headindex.currentIndex()uristr=self.lineEdit_uri.text().strip().encode('gbk')if len(uristr)<1:QMessageBox.critical(self,'提示','请输入要加入写卡缓冲区的网址URI!',QMessageBox.Yes)self.lineEdit_uri.setFocus()returnelse:status = Objdll.tagbuf_adduri(languagecodestr, len(languagecodestr), titlestr, len(titlestr), uriheaderindex,uristr, len(uristr)) % 256if status == 0:self.ListBottom("网址URL加入NDEF写卡缓冲区成功,可继续添加标签信息到缓冲区,也可以将缓冲区现有信息写入标签!")else:self.ListBottom("网址URL加入NDEF写卡缓冲区失败!")def pushButton_Map_clicked(self):languagecodestr = "en".encode('gbk')titlestr=self.lineEdit_mapname.text().strip().encode('gbk')latitude=self.lineEdit_latitude.text().strip()longitude=self.lineEdit_longitude.text().strip()mapcoord = ("geo:" + latitude + "," + longitude).encode('gbk')status = Objdll.tagbuf_adduri(languagecodestr, len(languagecodestr), titlestr, len(titlestr), 0, mapcoord,len(mapcoord)) % 256if status == 0:self.ListBottom("地图坐标加入NDEF写卡缓冲区成功,可继续添加标签信息到缓冲区,也可以将缓冲区现有信息写入标签!")else:self.ListBottom("地图坐标加入NDEF写卡缓冲区失败!")def pushButton_Bluetooth_clicked(self):try:macname = self.lineEdit_Bluetoothname.text().strip() .encode('gbk')maclist = self.lineEdit_Bluetoothmac.text().strip().split(':')if (len(maclist) == 6):macbuf = bytes([eval('0x' + maclist[0]), eval('0x' + maclist[1]), eval('0x' + maclist[2]), eval('0x' + maclist[3]),eval('0x' + maclist[4]), eval('0x' + maclist[5])])status = Objdll.tagbuf_addbluetooth(macname, len(macname), macbuf) % 256if status == 0:self.ListBottom("蓝牙连接信息加入NDEF写卡缓冲区成功,可继续添加标签信息到缓冲区,也可以将缓冲区现有信息写入标签!")else:self.ListBottom("蓝牙连接信息加入NDEF写卡缓冲区失败!")else:QMessageBox.critical(self, '提示', '蓝牙MAC地址输入错误!', QMessageBox.Yes)self.lineEdit_Bluetoothmac.setFocus()except:QMessageBox.critical(self, '提示', '蓝牙MAC地址输入错误!', QMessageBox.Yes)self.lineEdit_Bluetoothmac.setFocus()def pushButton_Wifi_clicked(self):ssidstr = self.lineEdit_hostname.text().strip().encode('gbk')if len(ssidstr)<1:QMessageBox.critical(self,'提示','请输入要加入写卡缓冲区的热点名称!',QMessageBox.Yes)self.lineEdit_hostname.setFocus()returnauthtype=self.comboBox_auth.currentIndex()crypttype=self.comboBox_Calculation.currentIndex()keystr=self.lineEdit_password.text().strip().encode('gbk')status = Objdll.tagbuf_addwifi(ssidstr, len(ssidstr), authtype, crypttype, keystr, len(keystr)) % 256if status == 0:self.ListBottom("WIFI热点信息加入NDEF写卡缓冲区成功,可继续添加标签信息到缓冲区,也可以将缓冲区现有信息写入标签!")else:self.ListBottom("WIFI热点信息加入NDEF写卡缓冲区失败!")def pushButton_Card_clicked(self):infostr = "BEGIN:VCARD" + "\n"infostr = infostr + "VERSION:3.0" + "\n"infostr = infostr + "FN:"+self.lineEdit_name.text().strip()+ "\n"infostr = infostr + "TEL:" +self.lineEdit_tel.text().strip()+ "\n"infostr = infostr + "ORG:" +self.lineEdit_unilname.text().strip()+ "\n"infostr = infostr + "ADR:" +self.lineEdit_address.text().strip()+ "\n"infostr = infostr + "EMAIL:" +self.lineEdit_email.text().strip()+ "\n"infostr = infostr + "URL:" +self.lineEdit_net.text().strip()+ "\n"infostr = infostr + "END:VCARD"businesscard = infostr.encode('gbk')status = Objdll.tagbuf_addbusinesscard(businesscard, len(businesscard)) % 256if status == 0:self.ListBottom("电子名片信息加入NDEF写卡缓冲区成功,可继续添加标签信息到缓冲区,也可以将缓冲区现有信息写入标签!")else:self.ListBottom("电子名片信息加入NDEF写卡缓冲区失败!")def pushButton_Data_clicked(self):typestr = self.lineEdit_datatype.text().strip().encode('gbk')datastr = self.lineEdit_data.text().strip().encode('gbk')status = Objdll.tagbuf_adddata(typestr, len(typestr), datastr, len(datastr)) % 256if status == 0:self.ListBottom("自定义数据类型加入NDEF写卡缓冲区成功,可继续添加标签信息到缓冲区,也可以将缓冲区现有信息写入标签!")else:self.ListBottom("自定义数据类型加入NDEF写卡缓冲区失败!")def pushButton_Call_clicked(self):languagecodestr = "en".encode('gbk')titlestr = "".encode('gbk')CallNumber=self.lineEdit_callnum.text().strip().encode('gbk')status = Objdll.tagbuf_adduri(languagecodestr, len(languagecodestr), titlestr, len(titlestr), 5, CallNumber,len(CallNumber)) % 256if status == 0:self.ListBottom("呼叫电话加入NDEF写卡缓冲区成功,可继续添加标签信息到缓冲区,也可以将缓冲区现有信息写入标签!")else:self.ListBottom("呼叫电话加入NDEF写卡缓冲区失败!")def pushButton_readtag_clicked(self):#Objdll.tagbuf_forumtype4_clear()#Objdll.tagbuf_clear()self.plainTextEdit_taginf.setPlainText('')self.ReadTag('NDEF_ReadInfo')def pushButton_cleatag_clicked(self):Objdll.tagbuf_forumtype4_clear()Objdll.tagbuf_clear()self.checkBox_later.setChecked(False)self.WriteTag('NDEF_Clear')if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)mainWindow = MainWindow()screen = QDesktopWidget().screenGeometry()size = mainWindow.geometry()# 获得窗口相关坐标newLeft = (screen.width() - size.width()) // 2newTop = (screen.height() - size.height()) // 2# 移动窗口使其居中mainWindow.pushButton_clearbuff.setStyleSheet("color:red;")mainWindow.pushButton_writetag.setStyleSheet("color:blue;")mainWindow.move(newLeft, newTop)if sys.platform == 'linux' or sys.platform == 'mac':# Linux加载当前目录下的so库dllfile = sys.path[0] + '/libOURMIFARE.so'Objdll = ctypes.cdll.LoadLibrary(dllfile)else:# windows系统加载当前目录下的DLL库dllfile = sys.path[0] + '\OUR_MIFARE.dll'Objdll = ctypes.windll.LoadLibrary(dllfile)mainWindow.show()sys.exit(app.exec_())

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/828080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术速递|Java on Azure Tooling 3月更新 - Java on Azure 开发工具未来六个月路线图发布

作者&#xff1a;Jialuo Gan - Program Manager, Developer Division At Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎阅读 Java on Azure 工具的三月更新。在本次更新中&#xff0c;我们将分享未来几个月对 Java on Azure 开发工具的投资。此外&#xff0c;我…

Redis入门到通关之数据结构解析-Dict

文章目录 概述构成Dict的扩容Dict的rehash总结 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端开…

SpringBoot引入第三方jar包或本地jar包

idea2018创建spring boot项目 New Project窗口选择Spring Initializr Type选择Maven(Generate…),有两个Maven选择这一个。 勾选Spring Web。 pom.xml中version改成2.5.10。 在resources中新建jar目录&#xff0c;将第三方jar包fastjson2-2.0.47.jar放入其中。&#xff08…

国产FTP文件传输服务器需要具备哪些关键特性?

国产FTP文件传输服务器是指根据中国国内信息技术创新&#xff08;信创&#xff09;的要求和标准&#xff0c;自主研发的文件传输服务器软件。这类软件旨在替代传统的FTP服务器&#xff0c;以更好地适应国产化和信息安全的需要。国产FTP文件传输服务器通常需要具备以下要求&…

【ensp】网关冗余vrrp实验

基础文字知识复习时&#xff0c;添加&#xff0c;下文仅拓扑以及核心配置以及结果分析 冗余路由器 核心代码&#xff1a; int g0/0/0 [R1-GigabitEthernet0/0/0]vrrp vrid 1 virtual-ip 192.168.10.1 ###设置虚拟ip [R1-GigabitEthernet0/0/0]vrrp vrid 1 priority 120 …

零碳家庭 “光”的力量

有行业专家乐观预测&#xff0c;在供给充足、基础设施建设与时俱进的情况下&#xff0c;2025年&#xff0c;我国新能源汽车市场的占有率将会达到50%&#xff0c;2030年更有望突破90%的大关。为了方便新能源汽车的出行&#xff0c;在家中安装一个智能充电桩是越来越多驾驶者的选…

分类预测 | Matlab实现RIME-BP霜冰优化BP神经网络多特征分类预测

分类预测 | Matlab实现RIME-BP霜冰优化BP神经网络多特征分类预测 目录 分类预测 | Matlab实现RIME-BP霜冰优化BP神经网络多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.RIME-BP霜冰优化BP神经网络多特征分类预测&#xff08;Matlab实现完整源码和数据&a…

免杀技术之白加黑的攻击防御

一、介绍 1. 什么是白加黑 通俗的讲白加黑中的白就是指被杀软列入到可信任列表中的文件。比如说微软自带的系统文件或者一些有有效证书签名的文件,什么是微软文件&#xff0c;或者什么是有效签名文件在后面我们会提到他的辨别方法。黑就是指我们自己的文件&#xff0c;没有有…

【MCU】栈溢出问题

项目场景&#xff1a; 硬件&#xff1a;STM32F407&#xff0c;操作系统&#xff1a;rt_thread master分支 问题描述 问题栈溢出 id 499 ide 00 rtr 00 len 8 9 Function[rt_completion_wait] shall not be used in ISR (0) assertion failed at function:rt_completion_wait,…

屏幕状态自动检测+鼠标自动操作

目录 一、写在前面 1.1适用场景 1.2涉及到的库 二、函数库 2.1pyautogui-屏幕截图&鼠标操作 2.1.1屏幕截图screenshot函数 2.1.2鼠标移动及单击 2.2Opencv-模板匹配 2.2.1matchTemplate函数 2.2.2minMaxLoc函数 2.2.3相关代码 2.3base64-图片转base64 2.3.1在线…

Spring MVC和Spring Boot

上节已经提到过请求&#xff0c;这次梳理响应。 响应 响应基本上都要被Controller所托管&#xff0c;告诉Spring帮我们管理这个代码&#xff0c;我们在后面需要访问时&#xff0c;才可以进行访问&#xff0c;否则将会报错。并且其是由RestController分离出来的&#xff0c;Re…

java使用trim方法和replaceAll方法去除空格之后,还存在空格

今天使用其他人的一个功能&#xff0c;发现生成的映射少了一个&#xff0c;后面去代码里面debug发现是字符串中左边空格没有去除导致。查看代码&#xff0c;里面是使用了字符串.trim().replaceAll(" ", "")去除空格的。这个代码虽然能去除&#xff08;半角…

[Java EE] 多线程(四):线程安全问题(下)

1.5 volatile关键字 我们在了解这个关键字之前,我们首先要把产生线程安全的第4个原因补齐,我们来说说由于内存可见性引起的线程安全问题. 我们来看下面这样一段代码: import java.util.Scanner;public class Demo16 {public static int count 0;public static void main(Str…

深度学习算法简介(一)

目录 ⛳️推荐 前言 1、深度神经网络&#xff08;DNN&#xff09; 2、卷积神经网络&#xff08;CNN&#xff09; 3、残差网络&#xff08;ResNet&#xff09; 4、LSTM&#xff08;长短时记忆网络&#xff09; 5、Word2Vec 6、Transformer 7、生成对抗网络&#xff08;…

kmeans实现图像像素分类

代码 import tkinter as tkfrom tkinter import filedialogfrom PIL import Image, ImageTkimport numpy as np import random import mathclass Cluster(object):def __init__(self):# pixels是像素的意思&#xff0c;这里定义一个像素组用来存放像素的值self.pixels []# 创…

HubSpot功能有哪些?

HubSpot是一个功能丰富的平台&#xff0c;主要涵盖市场营销、销售、客户服务和客户关系管理&#xff08;CRM&#xff09;等领域。以下是HubSpot的一些主要功能&#xff1a; 市场营销自动化&#xff1a;HubSpot允许用户制定和执行多渠道的市场营销活动&#xff0c;包括创建和管…

力扣HOT100 - 105. 从前序与中序遍历序列构造二叉树

解题思路&#xff1a; 分治 以中序遍历为参照&#xff0c;用前序遍历的节点构建二叉树。 root 1 index - left表示前序遍历右子树的开始节点&#xff0c;即当前节点的下一个节点左子树长度。 class Solution {int[] preorder;HashMap<Integer, Integer> map new Ha…

C#基础:WPF中常见控件的布局基础

一、用ViewBox实现放缩控件不变 二、布局代码 <Window x:Class"WpfApp1.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"Title"MainWindow"…

小瓶清洗桶抗酸碱耐高温PFA清洗器半导体实验清洗用

PFA清洗桶&#xff0c;也叫PFA清洗器、PFA小瓶清洗桶&#xff0c;主要用于清洗浸泡实验室小型PFA溶样罐和烧杯等&#xff0c;带有密封螺纹盖&#xff0c;可以用于摇晃&#xff0c;高纯耐高温材质可放置电热板上加热使用。 特点&#xff1a;可拆卸倒酸口&#xff0c;可安全倒出酸…

ctfshow菜狗杯 web 无算力以及easyPytHon_P

web签到题 error_reporting(0); highlight_file(__FILE__);eval($_REQUEST[$_GET[$_POST[$_COOKIE[CTFshow-QQ群:]]]][6][0][7][5][8][0][9][4][4]);套娃传参 中文要编码 Cookies &#xff1a;CTFshow-QQ%E7%BE%A4:a POST:ab GET:?bc&c[6][0][7][5][8][0][9][4][4]syste…