当前位置:首页 > Python教程 > python技巧

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

项目地址: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 11import Tkinter as tk
 12 13 g_default_theme = "dark" 14# g_default_theme = "default" 15 16class PyButton(tk.Button):
 17‘‘‘ 18    Button
 19‘‘‘ 20def__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 27def choose_theme(self):
 28if self.theme == "dark":
 29             dark_theme_dict = {
 30"activebackground": "#00B2EE",
 31"activeforeground": "#E0EEEE",
 32"bg": "#008B8B",
 33"fg": "#FFFFFF" 34                              }
 35for key,value in dark_theme_dict.items():
 36                 self.temp[key] = value
 37 38for key,value in self.kv.items():
 39                 self.temp[key] = value
 40 41class PyLabel(tk.Label):
 42‘‘‘ 43    Label
 44‘‘‘ 45def__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 52def choose_theme(self):
 53if self.theme == "dark":
 54             dark_theme_dict = {
 55"bg": "#292929",
 56"fg": "#E0EEEE" 57                              }
 58for key,value in dark_theme_dict.items():
 59                 self.temp[key] = value
 60 61for key,value in self.kv.items():
 62                 self.temp[key] = value
 63 64class PyLabelFrame(tk.LabelFrame):
 65‘‘‘ 66    Frame
 67‘‘‘ 68def__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 75def choose_theme(self):
 76if self.theme == "dark":
 77             dark_theme_dict = {
 78"bg": "#292929",
 79"fg": "#1E90FF" 80                              }
 81for key,value in dark_theme_dict.items():
 82                 self.temp[key] = value
 83 84for key,value in self.kv.items():
 85                 self.temp[key] = value
 86 87class PyListbox(tk.Listbox):
 88‘‘‘ 89    Listbox
 90‘‘‘ 91def__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 98def choose_theme(self):
 99if self.theme == "dark":
100             dark_theme_dict = {
101"bg": "#292929",
102"fg": "#1E90FF",
103"selectbackground": "#00B2EE"104                              }
105for key,value in dark_theme_dict.items():
106                 self.temp[key] = value
107108for key,value in self.kv.items():
109                 self.temp[key] = value
110111class PyText(tk.Text):
112‘‘‘113    Text
114‘‘‘115def__init__(self, master, theme=g_default_theme, **kv):
116         self.theme = theme
117         self.kv = kv
118         self.temp = dict()
119        self.choose_theme()
120         tk.Text.__init__(self, master, self.temp)
121122def choose_theme(self):
123if self.theme == "dark":
124             dark_theme_dict = {
125"bg": "#292929",
126"fg": "#1E90FF"127                              }
128for key,value in dark_theme_dict.items():
129                 self.temp[key] = value
130131for key,value in self.kv.items():
132                 self.temp[key] = value
133134class PyCheckbutton(tk.Checkbutton):
135‘‘‘136    Checkbutton
137‘‘‘138def__init__(self, master, theme=g_default_theme, **kv):
139         self.theme = theme
140         self.kv = kv
141         self.temp = dict()
142        self.choose_theme()
143         tk.Checkbutton.__init__(self, master, self.temp)
144145def choose_theme(self):
146if self.theme == "dark":
147             dark_theme_dict = {
148"bg": "#292929",
149"fg": "#FFFFFF",
150"activebackground": "#292929",
151"activeforeground": "#FFFFFF",
152"selectcolor": "#292929"153                              }
154for key,value in dark_theme_dict.items():
155                 self.temp[key] = value
156157for key,value in self.kv.items():
158                 self.temp[key] = value
159160class PyRadiobutton(tk.Radiobutton):
161‘‘‘162    Radiobutton
163‘‘‘164def__init__(self, master, theme=g_default_theme, **kv):
165         self.theme = theme
166         self.kv = kv
167         self.temp = dict()
168        self.choose_theme()
169         tk.Radiobutton.__init__(self, master, self.temp) 
170171def choose_theme(self):
172if self.theme == "dark":
173             dark_theme_dict = {
174"bg": "#292929",
175"fg": "#FFFFFF",
176"activebackground": "#292929",
177"selectcolor": "#292929"178                              }
179for key,value in dark_theme_dict.items():
180                 self.temp[key] = value
181182for key,value in self.kv.items():
183                 self.temp[key] = value
184185186class PyEntry(tk.Entry):
187‘‘‘188    Entry
189‘‘‘190def__init__(self, master, theme=g_default_theme, **kv):
191         self.theme = theme
192         self.kv = kv
193         self.temp = dict()
194        self.choose_theme()
195         tk.Entry.__init__(self, master, self.temp)
196197def choose_theme(self):
198if self.theme == "dark":
199             dark_theme_dict = {
200"bg": "#292929",
201"fg": "#E0EEEE",
202"insertbackground": "#E0EEEE"203                              }
204for key,value in dark_theme_dict.items():
205                 self.temp[key] = value
206207for key,value in self.kv.items():
208                 self.temp[key] = value
209210if__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()
220for 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)
226227     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" 91011import pywinusb.hid as hid
121314class hidHelper(object):
15def__init__(self, vid=0x1391, pid=0x2111):
16         self.alive = False
17         self.device = None
18         self.report = None
19         self.vid = vid
20         self.pid = pid
2122def start(self):
23‘‘‘24        开始,打开HID设备
25‘‘‘26         _filter = hid.HidDeviceFilter(vendor_id = self.vid, product_id = self.pid)
27         hid_device = _filter.get_devices()
28if 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 = True
3334def stop(self):
35‘‘‘36        停止,关闭HID设备
37‘‘‘38         self.alive = False
39if self.device:
40            self.device.close()
4142def setcallback(self):
43‘‘‘44        设置接收数据回调函数
45‘‘‘46if self.device:
47            self.device.set_raw_data_handler(self.read)
4849def read(self, data):
50‘‘‘51        接收数据回调函数
52‘‘‘53print([hex(item).upper() for item in data[1:]])
5455def write(self, send_list):
56‘‘‘57        向HID设备发送数据
58‘‘‘59if self.device:
60if self.report:
61                self.report[0].set_raw_data(send_list)
62                 bytes_num = self.report[0].send()
63return bytes_num
646566if__name__ == __main__:
67     myhid = hidHelper()
68    myhid.start()
69if myhid.alive:
70        myhid.setcallback()
71         send_list = [0x00 for i in range(65)]
72        myhid.write(send_list)
73import time
74         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 11import threading
 12import usb.util
 13import usb.core
 14 15 16class usbHelper(object):
 17def__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 24def start(self):
 25‘‘‘ 26        开始,打开usb设备
 27‘‘‘ 28         self.dev = usb.core.find(idVendor=self.vid, idProduct=self.pid)
 29if 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 36def stop(self):
 37‘‘‘ 38        停止,关闭usb设备,释放接口
 39‘‘‘ 40         self.alive = False
 41if self.handle:
 42            self.handle.releaseInterface()
 43 44def open(self):
 45‘‘‘ 46        打开usb设备
 47‘‘‘ 48         busses = usb.busses()
 49for bus in busses:
 50             devices = bus.devices
 51for device in devices:
 52if device.idVendor == self.vid and device.idProduct == self.pid:
 53                     self.handle = device.open()
 54# Attempt to remove other drivers using this device. 55if self.dev.is_kernel_driver_active(0):
 56try:
 57                            self.handle.detachKernelDriver(0)
 58except Exception as e:
 59                             self.alive = False
 60try:
 61                        self.handle.claimInterface(0)
 62except Exception as e:
 63                         self.alive = False
 64 65def read(self, size=64, timeout=0):
 66‘‘‘ 67        读取usb设备发过来的数据
 68‘‘‘ 69if size >= self.size:
 70             self.size = size
 71 72if self.handle:
 73             data = self.handle.interruptRead(self.ep_in, self.size, timeout)
 74 75try:
 76             data_list = data.tolist()
 77return data_list
 78except:
 79return list()
 80 81def write(self, send_list, timeout=1000):
 82‘‘‘ 83        发送数据给usb设备
 84‘‘‘ 85if self.handle:
 86             bytes_num = self.handle.interruptWrite(self.ep_out, send_list, timeout)
 87return bytes_num
 88 89if__name__ == __main__:
 90import 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) 98while True: 
 99try:
100             mylist = dev.read()
101print mylist
102if mylist[1] == 0x02: 
103break104except:
105            dev.stop()
106break107     dev.stop()

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

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

原文:http://www.cnblogs.com/jakeyChen/p/4463530.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐