首页 > 学院 > 开发设计 > 正文

USB调试工具(python2.7+Tkinter+pyusb/pywinusb)

2019-11-14 17:14:32
字体:
来源:转载
供稿:网友

项目地址:USB-HID-TEST

整体预览图(win8下的效果):

======================

项目结构:

COM

--hidHelper.py

--usbHelper.py

UI

--Adaptive.py

--HID_TESTUI.py

--PyTkinter.py

main.py

======================

UI文件夹:

使用PyTkinter来初始化一些颜色配置(个人喜好)

实现代码:

  1 #! /usr/bin/env python  2 # -*- coding: utf-8 -*-  3   4 '''  5 Tkinter控件初始化配置(默认为深色)  6 '''  7 __author__ = "jakey.chen"  8 __version__ = "v1.0"  9  10  11 import Tkinter as tk 12  13 g_default_theme = "dark" 14 # g_default_theme = "default" 15  16 class PyButton(tk.Button): 17     ''' 18     Button 19     ''' 20     def __init__(self, master, theme=g_default_theme, **kv): 21         self.theme = theme 22         self.kv = kv 23         self.temp = dict() 24         self.choose_theme() 25         tk.Button.__init__(self, master, self.temp) 26  27     def choose_theme(self): 28         if self.theme == "dark": 29             dark_theme_dict = { 30                                 "activebackground": "#00B2EE", 31                                 "activeforeground": "#E0EEEE", 32                                 "bg": "#008B8B", 33                                 "fg": "#FFFFFF" 34                               } 35             for key,value in dark_theme_dict.items(): 36                 self.temp[key] = value 37  38             for key,value in self.kv.items(): 39                 self.temp[key] = value 40  41 class PyLabel(tk.Label): 42     ''' 43     Label 44     ''' 45     def __init__(self, master, theme=g_default_theme, **kv): 46         self.theme = theme 47         self.kv = kv 48         self.temp = dict() 49         self.choose_theme() 50         tk.Label.__init__(self, master, self.temp) 51  52     def choose_theme(self): 53         if self.theme == "dark": 54             dark_theme_dict = { 55                                 "bg": "#292929", 56                                 "fg": "#E0EEEE" 57                               } 58             for key,value in dark_theme_dict.items(): 59                 self.temp[key] = value 60  61             for key,value in self.kv.items(): 62                 self.temp[key] = value 63  64 class PyLabelFrame(tk.LabelFrame): 65     ''' 66     Frame 67     ''' 68     def __init__(self, master, theme=g_default_theme, **kv): 69         self.theme = theme 70         self.kv = kv 71         self.temp = dict() 72         self.choose_theme() 73         tk.LabelFrame.__init__(self, master, self.temp) 74  75     def choose_theme(self): 76         if self.theme == "dark": 77             dark_theme_dict = { 78                                 "bg": "#292929", 79                                 "fg": "#1E90FF" 80                               } 81             for key,value in dark_theme_dict.items(): 82                 self.temp[key] = value 83  84             for key,value in self.kv.items(): 85                 self.temp[key] = value 86  87 class PyListbox(tk.Listbox): 88     ''' 89     Listbox 90     ''' 91     def __init__(self, master, theme=g_default_theme, **kv): 92         self.theme = theme 93         self.kv = kv 94         self.temp = dict() 95         self.choose_theme() 96         tk.Listbox.__init__(self, master, self.temp) 97  98     def choose_theme(self): 99         if self.theme == "dark":100             dark_theme_dict = {101                                 "bg": "#292929",102                                 "fg": "#1E90FF",103                                 "selectbackground": "#00B2EE"104                               }105             for key,value in dark_theme_dict.items():106                 self.temp[key] = value107 108             for key,value in self.kv.items():109                 self.temp[key] = value110 111 class PyText(tk.Text):112     '''113     Text114     '''115     def __init__(self, master, theme=g_default_theme, **kv):116         self.theme = theme117         self.kv = kv118         self.temp = dict()119         self.choose_theme()120         tk.Text.__init__(self, master, self.temp)121 122     def choose_theme(self):123         if self.theme == "dark":124             dark_theme_dict = {125                                 "bg": "#292929",126                                 "fg": "#1E90FF"127                               }128             for key,value in dark_theme_dict.items():129                 self.temp[key] = value130 131             for key,value in self.kv.items():132                 self.temp[key] = value133 134 class PyCheckbutton(tk.Checkbutton):135     '''136     Checkbutton137     '''138     def __init__(self, master, theme=g_default_theme, **kv):139         self.theme = theme140         self.kv = kv141         self.temp = dict()142         self.choose_theme()143         tk.Checkbutton.__init__(self, master, self.temp)144 145     def choose_theme(self):146         if self.theme == "dark":147             dark_theme_dict = {148                                 "bg": "#292929",149                                 "fg": "#FFFFFF",150                                 "activebackground": "#292929",151                                 "activeforeground": "#FFFFFF",152                                 "selectcolor": "#292929"153                               }154             for key,value in dark_theme_dict.items():155                 self.temp[key] = value156 157             for key,value in self.kv.items():158                 self.temp[key] = value159 160 class PyRadiobutton(tk.Radiobutton):161     '''162     Radiobutton163     '''164     def __init__(self, master, theme=g_default_theme, **kv):165         self.theme = theme166         self.kv = kv167         self.temp = dict()168         self.choose_theme()169         tk.Radiobutton.__init__(self, master, self.temp) 170 171     def choose_theme(self):172         if self.theme == "dark":173             dark_theme_dict = {174                                 "bg": "#292929",175                                 "fg": "#FFFFFF",176                                 "activebackground": "#292929",177                                 "selectcolor": "#292929"178                               }179             for key,value in dark_theme_dict.items():180                 self.temp[key] = value181 182             for key,value in self.kv.items():183                 self.temp[key] = value184 185 186 class PyEntry(tk.Entry):187     '''188     Entry189     '''190     def __init__(self, master, theme=g_default_theme, **kv):191         self.theme = theme192         self.kv = kv193         self.temp = dict()194         self.choose_theme()195         tk.Entry.__init__(self, master, self.temp)196 197     def choose_theme(self):198         if self.theme == "dark":199             dark_theme_dict = {200                                 "bg": "#292929",201                                 "fg": "#E0EEEE",202                                 "insertbackground": "#E0EEEE"203                               }204             for key,value in dark_theme_dict.items():205                 self.temp[key] = value206 207             for key,value in self.kv.items():208                 self.temp[key] = value209 210 if __name__ == '__main__':211     root = tk.Tk()212     root.configure(bg="#292929")213     PyButton(root, text="1234", font=("Monaco", 12)).pack()214     PyLabel(root, text="123", font=("Monaco", 15)).pack()215     PyCheckbutton(root, text="123", font=("Monaco", 15)).pack()216     PyEntry(root, font=("Monaco", 15)).pack()217     PyText(root, font=("Monaco", 15), height=2, width=20).pack()218     listbox_0 = PyListbox(root, height=2, font=("Monaco", 15))219     listbox_0.pack()220     for i in range(2):221         listbox_0.insert("end", i)222     radio_intvar = tk.IntVar()223     PyRadiobutton(root, text="001", variable=radio_intvar, value=0, font=("Monaco", 15)).pack()224     PyRadiobutton(root, text="002", variable=radio_intvar, value=1, font=("Monaco", 15)).pack()225     radio_intvar.set(1)226 227     root.mainloop()

主界面构建不表,使用LabelFrame通过grid布局组成

具体自行查看项目代码

======================

COM文件夹

Windows下:

使用pywinusb

 1 #! /usr/bin/env python 2 # -*- coding: utf-8 -*- 3  4 ''' 5 win下使用的HID设备通讯帮助类 6 ''' 7 __author__ = "jakey.chen" 8 __version__ = "v1.0" 9 10 11 import pywinusb.hid as hid12 13 14 class hidHelper(object):15     def __init__(self, vid=0x1391, pid=0x2111):16         self.alive = False17         self.device = None18         self.report = None19         self.vid = vid20         self.pid = pid21 22     def start(self):23         '''24         开始,打开HID设备25         '''26         _filter = hid.HidDeviceFilter(vendor_id = self.vid, PRoduct_id = self.pid)27         hid_device = _filter.get_devices()28         if len(hid_device) > 0:29             self.device = hid_device[0]30             self.device.open()31             self.report = self.device.find_output_reports()32             self.alive = True33 34     def stop(self):35         '''36         停止,关闭HID设备37         '''38         self.alive = False39         if self.device:40             self.device.close()41 42     def setcallback(self):43         '''44         设置接收数据回调函数45         '''46         if self.device:47             self.device.set_raw_data_handler(self.read)48 49     def read(self, data):50         '''51         接收数据回调函数52         '''53         print([hex(item).upper() for item in data[1:]])54 55     def write(self, send_list):56         '''57         向HID设备发送数据58         '''59         if self.device:60             if self.report:61                 self.report[0].set_raw_data(send_list)62                 bytes_num = self.report[0].send()63                 return bytes_num64 65 66 if __name__ == '__main__':67     myhid = hidHelper()68     myhid.start()69     if myhid.alive:70         myhid.setcallback()71         send_list = [0x00 for i in range(65)]72         myhid.write(send_list)73         import time74         time.sleep(0.5)75         myhid.stop()

linux(我使用的是Ubuntu14.04)下:

  1 #! /usr/bin/env python  2 # -*- coding: utf-8 -*-  3   4 '''  5 linux下使用的usb设备通讯帮助类  6 '''  7 __author__ = "jakey.chen"  8 __version__ = "v1.0"  9  10  11 import threading 12 import usb.util 13 import usb.core 14  15  16 class usbHelper(object): 17     def __init__(self, vid=0x1391, pid=0x2111): 18         self.alive = False 19         self.handle = None 20         self.size = 64 21         self.vid = vid 22         self.pid = pid 23  24     def start(self): 25         ''' 26         开始,打开usb设备 27         ''' 28         self.dev = usb.core.find(idVendor=self.vid, idProduct=self.pid) 29         if self.dev != None: 30             self.ep_in = self.dev[0][(0,0)][0].bEndpointAddress 31             self.ep_out = self.dev[0][(0,0)][1].bEndpointAddress 32             self.size = self.dev[0][(0,0)][1].wMaxPacketSize 33         self.open() 34         self.alive = True 35  36     def stop(self): 37         ''' 38         停止,关闭usb设备,释放接口 39         ''' 40         self.alive = False 41         if self.handle: 42             self.handle.releaseInterface() 43  44     def open(self): 45         ''' 46         打开usb设备 47         ''' 48         busses = usb.busses() 49         for bus in busses: 50             devices = bus.devices 51             for device in devices: 52                 if device.idVendor == self.vid and device.idProduct == self.pid: 53                     self.handle = device.open() 54                     # Attempt to remove other drivers using this device. 55                     if self.dev.is_kernel_driver_active(0): 56                         try: 57                             self.handle.detachKernelDriver(0) 58                         except Exception as e: 59                             self.alive = False 60                     try: 61                         self.handle.claimInterface(0) 62                     except Exception as e: 63                         self.alive = False 64  65     def read(self, size=64, timeout=0): 66         ''' 67         读取usb设备发过来的数据 68         ''' 69         if size >= self.size: 70             self.size = size 71  72         if self.handle: 73             data = self.handle.interruptRead(self.ep_in, self.size, timeout) 74  75         try: 76             data_list = data.tolist() 77             return data_list 78         except: 79             return list() 80  81     def write(self, send_list, timeout=1000): 82         ''' 83         发送数据给usb设备 84         ''' 85         if self.handle: 86             bytes_num = self.handle.interruptWrite(self.ep_out, send_list, timeout) 87             return bytes_num 88  89 if __name__ == '__main__': 90     import time 91     dev = usbHelper() 92  93     dev.start() 94  95     send_list = [0xAA for i in range(64)] 96     dev.write(send_list) 97     # time.sleep(0.25) 98     while True:  99         try:100             mylist = dev.read()101             print mylist102             if mylist[1] == 0x02: 103                 break104         except:105             dev.stop()106             break107     dev.stop()

======================

主函数:界面逻辑。不表,自行查看。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表