1 #! /usr/bin/env python
2 #-*- coding: utf-8 -*-
3
4 importTkinter as tk5 importttk6 importPyTkinter as pytk7 importAdaptive8
9 font =Adaptive.monaco_font10 size_dict =Adaptive.size_dict11 g_default_theme =pytk.g_default_theme12
13
14 classSerialToolUI(object):15 def __init__(self, master=None):16 self.root =master17 self.create_frame()18 self.thresholdValue = 1
19
20 defcreate_frame(self):21 '''
22 新建窗口,分为上下2个部分,下半部分为状态栏23 '''
24 self.frm =pytk.PyLabelFrame(self.root)25 self.frm_status =pytk.PyLabelFrame(self.root)26
27 self.frm.grid(row=0, column=0, sticky="wesn")28 self.frm_status.grid(row=1, column=0, sticky="wesn")29
30 self.create_frm()31 self.create_frm_status()32
33 defcreate_frm(self):34 '''
35 上半部分窗口分为左右2个部分36 '''
37 self.frm_left =pytk.PyLabelFrame(self.frm)38 self.frm_right =pytk.PyLabelFrame(self.frm)39
40 self.frm_left.grid(row=0, column=0, padx=5, pady=5, sticky="wesn")41 self.frm_right.grid(row=0, column=1, padx=5, pady=5, sticky="wesn")42
43 self.create_frm_left()44 self.create_frm_right()45
46 defcreate_frm_left(self):47 '''
48 上半部分左边窗口:49 Listbox显示可用的COM口50 Button按钮点击连接设备51 '''
52 self.frm_left_label =pytk.PyLabel(self.frm_left,53 text="Serial Ports",54 font=font)55 self.frm_left_listbox =pytk.PyListbox(self.frm_left,56 height=size_dict["list_box_height"],57 font=font)58 self.frm_left_serial_set =pytk.PyLabelFrame(self.frm_left)59 self.frm_left_btn =pytk.PyButton(self.frm_left,60 text="Open",61 font=font,62 command=self.Toggle)63
64 self.frm_left_label.grid(row=0, column=0, padx=5, pady=5, sticky="w")65 self.frm_left_listbox.grid(row=1, column=0, padx=5, pady=5, sticky="wesn")66 self.frm_left_serial_set.grid(row=2, column=0, padx=5, pady=5, sticky="wesn")67 self.frm_left_btn.grid(row=3, column=0, padx=5, pady=5, sticky="wesn")68
69 self.frm_left_listbox.bind("", self.Open)70 self.create_frm_left_serial_set()71
72 defcreate_frm_left_serial_set(self):73 '''
74 串口配置,比如波特率,奇偶校验等75 '''
76 setting_label_list = ["BaudRate :", "Parity :", "DataBit :", "StopBit :"]77 baudrate_list = ["1200", "2400", "4800", "9600", "14400", "19200", "38400",78 "43000", "57600", "76800", "115200", "12800"]79 #PARITY_NONE, PARITY_EVEN, PARITY_ODD PARITY_MARK, PARITY_SPACE
80 parity_list = ["N", "E", "O", "M", "S"]81 bytesize_list = ["5", "6", "7", "8"]82 stopbits_list = ["1", "1.5", "2"]83 for index,item inenumerate(setting_label_list):84 frm_left_label_temp =pytk.PyLabel(self.frm_left_serial_set,85 text=item,86 font=('Monaco', 10))87 frm_left_label_temp.grid(row=index, column=0, padx=1, pady=2, sticky="e")88 self.frm_left_combobox_baudrate =ttk.Combobox(self.frm_left_serial_set,89 width=15,90 values=baudrate_list)91 self.frm_left_combobox_parity =ttk.Combobox(self.frm_left_serial_set,92 width=15,93 values=parity_list)94 self.frm_left_combobox_databit =ttk.Combobox(self.frm_left_serial_set,95 width=15,96 values=bytesize_list)97 self.frm_left_combobox_stopbit =ttk.Combobox(self.frm_left_serial_set,98 width=15,99 values=stopbits_list)100 self.frm_left_combobox_baudrate.grid(row=0, column=1, padx=2, pady=2, sticky="e")101 self.frm_left_combobox_parity.grid(row=1, column=1, padx=2, pady=2, sticky="e")102 self.frm_left_combobox_databit.grid(row=2, column=1, padx=2, pady=2, sticky="e")103 self.frm_left_combobox_stopbit.grid(row=3, column=1, padx=2, pady=2, sticky="e")104
105 self.frm_left_combobox_baudrate.current(3)106 self.frm_left_combobox_parity.current(0)107 self.frm_left_combobox_databit.current(3)108 self.frm_left_combobox_stopbit.current(0)109
110 defcreate_frm_right(self):111 '''
112 上半部分右边窗口:113 分为4个部分:114 1、Label显示和重置按钮和发送按钮115 2、Text显示(发送的数据)116 3、Label显示和十六进制选择显示和清除接收信息按钮117 4、Text显示接收到的信息118 '''
119 self.frm_right_reset =pytk.PyLabelFrame(self.frm_right)120 self.frm_right_send =pytk.PyText(self.frm_right,121 width=50,122 height=size_dict["send_text_height"],123 font=("Monaco", 9))124 self.frm_right_clear =pytk.PyLabelFrame(self.frm_right)125 self.frm_right_receive =pytk.PyText(self.frm_right,126 width=50,127 height=size_dict["receive_text_height"],128 font=("Monaco", 9))129
130 self.frm_right_reset.grid(row=0, column=0, padx=1, sticky="wesn")131 self.frm_right_send.grid(row=1, column=0, padx=1, sticky="wesn")132 self.frm_right_clear.grid(row=2, column=0, padx=1, sticky="wesn")133 self.frm_right_receive.grid(row=3, column=0, padx=1, sticky="wesn")134
135 self.frm_right_receive.tag_config("green", foreground="#228B22")136
137 self.create_frm_right_reset()138 self.create_frm_right_clear()139
140 defcreate_frm_right_reset(self):141 '''
142 1、Label显示和重置按钮和发送按钮143 '''
144 self.frm_right_reset_label =pytk.PyLabel(self.frm_right_reset,145 text="Data Send" + " "*size_dict["reset_label_width"],146 font=font)147 self.new_line_cbtn_var =tk.IntVar()148 self.send_hex_cbtn_var =tk.IntVar()149 self.frm_right_reset_newLine_checkbtn =pytk.PyCheckbutton(self.frm_right_reset,150 text="New Line",151 variable=self.new_line_cbtn_var,152 font=font)153 self.frm_right_reset_hex_checkbtn =pytk.PyCheckbutton(self.frm_right_reset,154 text="Hex",155 variable=self.send_hex_cbtn_var,156 font=font)157 self.frm_right_reset_btn =pytk.PyButton(self.frm_right_reset,158 text="Reset",159 width=10,160 font=font,161 command=self.Reset)162 self.frm_right_send_btn =pytk.PyButton(self.frm_right_reset,163 text="Send",164 width=10,165 font=font,166 command=self.Send)167
168 self.frm_right_reset_label.grid(row=0, column=0, sticky="w")169 self.frm_right_reset_newLine_checkbtn.grid(row=0, column=1, sticky="wesn")170 self.frm_right_reset_hex_checkbtn.grid(row=0, column=2, sticky="wesn")171 self.frm_right_reset_btn.grid(row=0, column=3, padx=5, pady=5, sticky="wesn")172 self.frm_right_send_btn.grid(row=0, column=4, padx=5, pady=5, sticky="wesn")173
174 defcreate_frm_right_clear(self):175 '''
176 3、Label显示和十六进制显示和清除接收信息按钮177 '''
178 self.receive_hex_cbtn_var =tk.IntVar()179 self.frm_right_clear_label =pytk.PyLabel(self.frm_right_clear,180 text="Data Received"+ " "*size_dict["clear_label_width"],181 font=font)182 self.frm_right_threshold_label =pytk.PyLabel(self.frm_right_clear,183 text="Threshold:",184 font=font)185 self.thresholdStr =tk.StringVar()186 self.frm_right_threshold_entry =pytk.PyEntry(self.frm_right_clear,187 textvariable=self.thresholdStr,188 width=6,189 font=font)190 self.frm_right_hex_checkbtn =pytk.PyCheckbutton(self.frm_right_clear,191 text="Hex",192 variable=self.receive_hex_cbtn_var,193 relief="flat",194 font=font)195 self.frm_right_clear_btn =pytk.PyButton(self.frm_right_clear,196 text="Clear",197 width=10,198 font=font,199 command=self.Clear)200
201 self.frm_right_clear_label.grid(row=0, column=0, padx=5, pady=5, sticky="w")202 self.frm_right_threshold_label.grid(row=0, column=1, padx=5, pady=5, sticky="wesn")203 self.frm_right_threshold_entry.grid(row=0, column=2, padx=5, pady=5, sticky="wesn")204 self.frm_right_hex_checkbtn.grid(row=0, column=3, padx=5, pady=5, sticky="wesn")205 self.frm_right_clear_btn.grid(row=0, column=4, padx=5, pady=5, sticky="wesn")206
207 self.thresholdStr.set(1)208 self.thresholdStr.trace('w', self.GetThresholdValue)209
210 defcreate_frm_status(self):211 '''
212 下半部分状态栏窗口213 '''
214 self.frm_status_label =pytk.PyLabel(self.frm_status,215 text="Ready",216 font=font)217 self.frm_status_label.grid(row=0, column=0, padx=5, pady=5, sticky="wesn")218
219 defToggle(self):220 pass
221
222 defOpen(self, event):223 pass
224
225 defReset(self):226 self.frm_right_send.delete("0.0", "end")227
228 defSend(self):229 pass
230
231 defClear(self):232 self.frm_right_receive.delete("0.0", "end")233
234 def GetThresholdValue(self, *args):235 try:236 self.thresholdValue =int(self.thresholdStr.get())237 except:238 pass
239
240
241 if __name__ == '__main__':242 '''
243 main loop244 '''
245 root =tk.Tk()246 if g_default_theme == "dark":247 root.configure(bg="#292929")248 combostyle =ttk.Style()249 combostyle.theme_use('alt')250 combostyle.configure("TCombobox", selectbackground="#292929", fieldbackground="#292929",251 background="#292929", foreground="#FFFFFF")252 root.title("Serial-Tool")253 SerialToolUI(master=root)254 root.resizable(False, False)255 root.mainloop()