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来初始化一些颜色配置(个人喜好)

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

实现代码:

  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] = value

107 

108             for key,value in self.kv.items():

109                 self.temp[key] = value

110 

111 class PyText(tk.Text):

112     '''

113     Text

114     '''

115     def __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)

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] = value

130 

131             for key,value in self.kv.items():

132                 self.temp[key] = value

133 

134 class PyCheckbutton(tk.Checkbutton):

135     '''

136     Checkbutton

137     '''

138     def __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)

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] = value

156 

157             for key,value in self.kv.items():

158                 self.temp[key] = value

159 

160 class PyRadiobutton(tk.Radiobutton):

161     '''

162     Radiobutton

163     '''

164     def __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) 

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] = value

181 

182             for key,value in self.kv.items():

183                 self.temp[key] = value

184 

185 

186 class PyEntry(tk.Entry):

187     '''

188     Entry

189     '''

190     def __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)

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] = value

206 

207             for key,value in self.kv.items():

208                 self.temp[key] = value

209 

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 hid

12 

13 

14 class hidHelper(object):

15     def __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

21 

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 = True

33 

34     def stop(self):

35         '''

36         停止,关闭HID设备

37         '''

38         self.alive = False

39         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_num

64 

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 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 

 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 mylist

102             if mylist[1] == 0x02: 

103                 break

104         except:

105             dev.stop()

106             break

107     dev.stop()

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

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

你可能感兴趣的:(python2.7)