具体功能:
读取一个带有SN号信息的.elsx表,可以根据CCID通讯的终端设备,匹配特定SN号段的相关信息,后根据与终端自定的协议发送.elsx表中设备SN号段中所有配置信息,方便多个设备终端录入配置信息

总结:
俩个点:
1. TK界面 列表框 和 文本标签,可以设置一个tk.StringVar()类,然后 可以在另一个线程中调用类的set()方法,即可改变tk标签上的显示的内容

    varlistb = tk.StringVar()listb = tk.Listbox(root, listvariable=varlistb, height=20, width=50, yscrollcommand=sb.set)  # 创建两个列表组件var = tk.StringVar()  # 将label标签的内容设置为字符类型,用var来接收hit_me函数的传出内容用以显示在标签上l = tk.Label(root, textvariable=var, font=('Arial', 12), width=40, height=5)
2. 打包成.exe文件时, 使用 pyinstaller -F 时,运行显示 win系统找不到PySmartCard文件,所以打包的时候需要自己拼装相应的文件
#命令语法:pyinstaller -F 文件名(带后缀py)
#常用参数说明:
#–icon=图标路径
#-F 打包成一个exe文件
#-w 使用窗口,无控制台
#-c 使用控制台,无窗口
#-D 创建一个目录,里面包含exe以及其他一些依赖性文件

使用 pyinstaller -F -D xxxx.py,运行后再运行.exe,缺失什么文件,可以直接拷贝至.exe文件夹中即可

缺陷:
线程之前切换时,没有使用互斥锁,后期可以优化一下
源代码:

import xlrd
import tkinter as tk
import time
from PySmartCard.CpuCard import PcscReader
import threading
import os
#根据函数生成索引表
def Get_QR_ListData(table, i):return table.row_values(i)#得到各行数据
def Creat_QR_Data(suoyingList, Hang_data):i = 0Message = ''for StrMessage in suoyingList:if str(Hang_data[i]) != '':Message += StrMessage + '=' + str(Hang_data[i]) + '&'i = i + 1return (Message.encode('GBK'))#根据第几行生成对应的二维码
def Create_Photo(table,Meessage):global packDATA#print(Creat_QR_Data(Get_QR_ListData(table, 0), Get_QR_ListData(table, i)))num = table.nrowsrecv_list = []for i in range(1, num):if Meessage == 'SN':continueif Meessage in Get_QR_ListData(table, i):adu = Creat_QR_Data(Get_QR_ListData(table, 0), Get_QR_ListData(table, i))packDATA = adu#指令数据处理
def CCID_Data(adu):global ucModeif len(adu) > 1000:print("数据长度不能大于1000字节")exit()#指令头AT_Hear = 'F0 2F 51 '#数据地址AT_Hear_Adder = 16Pack_div_len = 252#包数据Pack_list = ['a1', 'a2', 'a3', 'a4']Pack_list.append(hex(int(len(adu) / Pack_div_len)).replace('0x', ''))Pack_list.append(hex(len(adu) % Pack_div_len).replace('0x', ''))#有效数据for i in adu:Pack_list.append(hex(i).replace('0x', ''))for i in range(0, int(len(Pack_list)/Pack_div_len) + 1):MessPackData = ''if i != int(len(Pack_list)/Pack_div_len):for MessBuf in Pack_list[i*Pack_div_len:(i+1)*Pack_div_len]:if len(MessBuf) == 1:MessPackData += '0'MessPackData += str(MessBuf)else:for MessBuf in Pack_list[i*Pack_div_len:]:if len(MessBuf) == 1:MessPackData += '0'MessPackData += str(MessBuf)Message = AT_Hear + str(hex(AT_Hear_Adder + i).replace('0x', '')) \+ hex(int(len(MessPackData)/2)).replace('0x', '') + MessPackDatarecv_list = []sendApdu(pcsc, Message, recv_list, 2)if recv_list[1] != '9000':var.set('CCID下载失败')  # 为label设置值var.set('参数下载成功')time.sleep(2)ucMode = 0def g():global packDATACCID_Data(packDATA)def showLog(data, issend):'''打印日志函数'''current = time.strftime('%Y_%m_%d %H:%M:%S', time.localtime())if issend:  # 发送到卡片的数据send = '-->'else:  # 卡片返回的数据send = '<--'print("{} {} {}".format(current, send, data))def sendApdu(reader, apdu, recv_list, readerType=None):'''给卡片发送指令的函数'''# 清空recv_list[:] = []# 去掉多余的空格apdu = apdu.replace(' ', '')#showLog(apdu, True)respone = reader.send_apdu(apdu, readerType)#showLog(respone, False)# recv_list第1个元素是返回数据recv_list.append(respone[:-4])# recv_list第2个元素是swrecv_list.append(respone[-4:])def SendCCidMeessage():'''获取所有的读卡器列表'''readerName = pcsc.get_pcsc_readerlist()##print(readerName)#字符串类型的读卡器名称,按;隔开# 按;切割字符串,得到所有的读卡器名称#print('当前连接的读卡器有:')readerNameList = readerName.split(';')for i in range(len(readerNameList) - 1):#print("{} {} :{}".format('reader', i, readerNameList[i]))pass'''连接指定的读卡器'''#print('*' * 40)# 要连接的读卡器useReaderName = "TianYu ANYPAY 0"# 得到的是字符串类型的复位信息ATR = pcsc.connect_device(useReaderName)if ATR:#print("ConnectDevice Success...")#print("ATR: ", ATR)return 1else:#print("ConnectDevice Failed!")#print("设备连接失败,请检查设备")return 0#线程操作
def autoCaozuo():global pcsc, SN, root, ucMode, tablewhile 1:if ucMode == 0:# '''实例化PCSC读卡器'''pcsc = PcscReader()#print(pcsc)if SendCCidMeessage() != 1:#print('设备请先进入维护模式')varlistb.set('')var.set('请先连接终端')  # 为label设置值ucMode = 7else:ucMode = 1elif ucMode == 1:pcsc = PcscReader()SendCCidMeessage()# 通过索引顺序获取if '商户信息配置表.xlsx' not in os.listdir(os.getcwd()):var.set('缺少商户信息配置表.xlsx')time.sleep(3)ucMode = 0else:data = xlrd.open_workbook('商户信息配置表.xlsx')table = data.sheet_by_index(0)# '''读SN号'''#recv_list = []SN = ''sendApdu(pcsc, 'FE 01 01 06 00', recv_list, 2)if recv_list[1] == '9000':LenSn = int(recv_list[0][2:4]) * 2SN = str(recv_list[0][4:4 + LenSn])# 找SN列的i = 0# 遍历0行 找SN列数的for Mesage in table.row_values(0):if 'SN' == Mesage:breaki += 1# SN列中对应的SN号a = 0for Message in table.col_values(i):a += 1if SN == Message:#print('SN号段匹配成功!')var.set('')Message_list = []j = 0# print('设备SN号: ' + SN)for title in table.row_values(0):Message_list.append(title + ':' + table.row_values(a-1)[j])j += 1varlistb.set(Message_list)Create_Photo(table, SN)ucMode = 2breakelse:if a == table.nrows:ucMode = 0var.set('未找到该设备对应的信息')  # 为label设置值breakelif ucMode == 7:ucMode = 0else:time.sleep(1)passdef auto_destroy():global ucModewhile 1:time.sleep(1)if ucMode == 2:g()elif ucMode == 7:ucMode = 0else:time.sleep(1)passdef CheckActive():while 1:if True != a.isAlive() or True != b.isAlive():a.join(1)b.join(1)var.set('工具异常,请检查运行环境')time.sleep(5)root.destroy()exit(0)if __name__ == '__main__':pcsc = []SN = ''ucMode = 0xixi = 1root = []packDATA = ''root = tk.Tk()  # 创建窗口对象的背景色sb = tk.Scrollbar(root)  # 垂直滚动条组件sb.pack(side=tk.RIGHT, fill=tk.Y)  # 设置垂直滚动条显示的位置varlistb = tk.StringVar()listb = tk.Listbox(root, listvariable=varlistb, height=20, width=50, yscrollcommand=sb.set)  # 创建两个列表组件listb.pack()  # 将小部件放置到主窗口中var = tk.StringVar()  # 将label标签的内容设置为字符类型,用var来接收hit_me函数的传出内容用以显示在标签上l = tk.Label(root, textvariable=var, font=('Arial', 12), width=40, height=5)l.pack()threadLock = threading.Lock()a = threading.Thread(target=autoCaozuo)b = threading.Thread(target=auto_destroy)c = threading.Thread(target=CheckActive)a.start()b.start()c.start()root.mainloop()

CCID多线程界面-python相关推荐

  1. Python之多线程:python多线程设计之同时执行多个函数命令详细攻略

    Python之多线程:python多线程设计之同时执行多个函数命令详细攻略 目录 实现功能 采取方法 应用场景 实现功能 同时执行多个函数命令 采取方法 T1.单个实现 import threadin ...

  2. c++ 多线程 类成员函数_多线程(C++/Python)

    多线程(C++/Python) 本文包括一下内容: 通过C++11的标准库进行多线程编程,包括线程的创建/退出,线程管理,线程之间的通信和资源管理,以及最常见的互斥锁,另外对python下多线程的实现 ...

  3. python开发的gui界面,python写gui应用程序

    python 编写gui界面有哪些 安装wxPython下面是wxPython特别基础的使用方法,将以一个小程序为例来说明,它的功能是在一个文本框中输入文件名,点击open按钮,会在另一个文本框中显示 ...

  4. 谁说QTP不能多线程 - 当Python遇上QTP

    谁说QTP不能多线程 - 当Python遇上QTP 作者:Wally Yu (微博:http://weibo.com/quicktest) 经常有人问我一个问题:QTP可以同时做多个项目的自动化吗?我 ...

  5. c++多线程调用python脚本

    为什么? 1.提升效率. 2.一开始代码是在python中用了多进程,后面发现c++调用的Python代码是无法开启多进程的.由于Python解释器有全局解释所GIL的原因,导致在同一时刻只能有一个线 ...

  6. wxPython多线程界面卡死或在不同平台崩溃问题

    一.测试程序界面 二.不使用多线程代码如下(当点击开启日志的时候,直接导致界面卡死) #coding:utf-8 import sys import threading import time imp ...

  7. c语言多线程转python多线程,真正的python 多线程!一个修饰符让你的多线程和C语言一样快...

    > Python 多线程因为GIL的存在,导致其速度比单线程还要慢.但是近期我发现了一个相当好用的库,这个库只需要增加一个修饰符就可以使原生的python多线程实现真正意义上的并发.本文将和大家 ...

  8. 产生随机数的用户图形界面Python GUI

    前言: Python GUI(用户图形界面)创建可以使用Python自带的Tkinter包,不需要额外装包.下面通过随机数的产生的例子进行初步了解. 源代码 windows系统.python3.7 # ...

  9. python学生管理系统界面-Python实现GUI学生信息管理系统

    本文实例为大家分享了Python实现GUI学生信息管理系统的具体代码,供大家参考,具体内容如下 项目环境: 软件环境: OS:RedHat6.3 Lib:Pygtk Language:Python S ...

最新文章

  1. 干 MySQL 两千万数据的大表优化解决过程,三种厉害的解决方案
  2. Thymeleaf引入公共片段方式
  3. 转【快速把web项目部署到weblogic上】
  4. mysql重启电脑提示145_MYSQL错误:Can’t open file: ‘#215;#215;#215;.MYI’ (errno: 145)修复方法...
  5. jQ html5拖放
  6. Docker进阶-容器监控cAdvisor+InfluxDB+Granfana
  7. 关于set.insert的一个问题,是否是常量的问题(未解决问题)
  8. 让人迷糊的 socket udp 连接问题
  9. 完整的Web应用程序Tomcat JSF Primefaces JPA Hibernate –第1部分
  10. 追MM与设计模式的有趣见解
  11. mysql 主从切换_mysql主从切换步骤
  12. QT5-STK二次开发实例
  13. 使用eclipse实现阿里云物联网平台数字签名(Signature)(附源代码)
  14. word2010 目录 摘要 正文 奇偶页页码不同的解决方法
  15. 终于有人把“内卷”和“囚徒困境”讲明白了!
  16. iOS 苹果2.1大礼包回复模版-guideline 2.1 Information Needed
  17. 英文版ubuntu系统如何添加中文拼音输入法
  18. linux 下安装mysql相关笔记
  19. 惠普硬盘测试工具_短DST未通过,手把手教你惠普笔记本如何检测硬盘
  20. HTML及HTML5学习笔记(心得感悟)

热门文章

  1. Alpha 冲刺(8/10)
  2. 数据化是什么,企业为什么要数据化管理?【Teamface企典】
  3. Thinkphp5 谷歌验证
  4. Open cv的Canny边缘检测和轮廓检测例子
  5. 多服务器显卡使用状态监控工具实现
  6. 微服务模式笔记:服务分解策略
  7. 科普丨什么是语言?什么是自然语言?
  8. 【ISCCC认证】WEB安全工程师认证介绍
  9. 助力PAT甲级/乙级取得满分的小技巧,STL容器
  10. 计算机音乐简单教学反思,一年级音乐教学反思(精选10篇)