保存文件功能完成

This commit is contained in:
vc4
2021-08-24 10:48:51 +08:00
parent 350a3793fd
commit 90fb7b17a6
2 changed files with 46 additions and 16 deletions

View File

@@ -26,8 +26,8 @@
"row": 3 "row": 3
}, },
{ {
"name":"btn-sendfile", "name":"btn-savefile",
"text":"发送文件", "text":"保存文件",
"column": 1, "column": 1,
"row": 4 "row": 4
}, },
@@ -186,7 +186,7 @@
"row": 6 "row": 6
} }
], ],
"Text":{ "ScrolledText":{
"name":"text-recv", "name":"text-recv",
"bg":"#cccccc", "bg":"#cccccc",
"column": 1, "column": 1,

View File

@@ -3,9 +3,11 @@
import os,sys,json import os,sys,json
import serial import serial
import serial.tools.list_ports import serial.tools.list_ports
import tkgen.gengui
import tkinter import tkinter
import threading import threading
import tkgen.gengui
import tkinter.scrolledtext
import tkinter.filedialog
import time, datetime import time, datetime
def tsnow(): def tsnow():
@@ -33,31 +35,53 @@ class UIproc():
self.ckbtn_time = self.root.get('ckbtn-time') self.ckbtn_time = self.root.get('ckbtn-time')
self.text_recv = self.root.get('text-recv') self.text_recv = self.root.get('text-recv')
self.entry_split = self.root.get('entry-split') self.entry_split = self.root.get('entry-split')
self.ckbtn_0d = self.root.get('ckbtn-0d')
self.ckbtn_0a = self.root.get('ckbtn-0a')
self.lastRecvTicks = 0 self.lastRecvTicks = 0
self.event_init() self.event_init()
def getSendData(self): def getSendData(self):
data = self.entry_sendText.var.get() data = self.entry_sendText.var.get()
encoding = self.entry_encoding.var.get() encoding = self.entry_encoding.var.get()
return self.ckbtn_shex.var.get() and bytes.fromhex(data) or data.encode(encoding, 'ignore') dat = self.ckbtn_shex.var.get() and bytes.fromhex(data) or data.encode(encoding, 'ignore')
dat += self.ckbtn_0d.var.get() and b'\r' or b''
dat += self.ckbtn_0a.var.get() and b'\n' or b''
return dat
def dmesg(self, cate, data): def dmesg(self, cate, data):
text = self.ckbtn_time.var.get() and '[%s]'%strnow() or '' text = self.ckbtn_time.var.get() and '[%s]'%strnow() or ''
encoding = self.entry_encoding.var.get() encoding = self.entry_encoding.var.get()
splitms = int(self.entry_split.var.get().replace('ms','')) splitms = int(self.entry_split.var.get().replace('ms',''))
ts = tsnow()
_i0 = self.text_recv.index('end');bg,fg='','black'
if cate == 'send' and self.ckbtn_sendshow.var.get(): if cate == 'send' and self.ckbtn_sendshow.var.get():
text += '> ' text += '> '
text += self.ckbtn_shex.var.get() and tohex(data) or data.decode(encoding, 'ignore') text += self.ckbtn_rhex.var.get() and tohex(data) or data.decode(encoding, 'ignore')
self.text_recv.insert('end', '\n'+text) #self.log('todo: [%s] send insert start' % tsnow())
#self.text_recv.insert('end', '\n'+text)
text = '\n'+text
#self.log('todo: [%s] send insert ok' % tsnow())
self.lastRecvTicks = 0 self.lastRecvTicks = 0
elif cate == 'recv': elif cate == 'recv':
ts = tsnow()
if(ts-self.lastRecvTicks>splitms): if(ts-self.lastRecvTicks>splitms):
text += '< ' text += '< '
text += self.ckbtn_rhex.var.get() and tohex(data) or data.decode(encoding, 'ignore') text += self.ckbtn_rhex.var.get() and tohex(data) or data.decode(encoding, 'ignore')
self.text_recv.insert('end', '\n'+text) #self.log('todo: [%s] recv1 insert start' % tsnow())
#self.text_recv.insert('end', '\n'+text)
text = '\n'+text
#self.log('todo: [%s] recv1 insert ok' % tsnow())
else: else:
text = self.ckbtn_rhex.var.get() and (' '+tohex(data)) or data.decode(encoding, 'ignore') text = self.ckbtn_rhex.var.get() and (' '+tohex(data)) or data.decode(encoding, 'ignore')
self.text_recv.insert('end', text) #self.log('todo: [%s] recv2 insert start' % tsnow())
#self.text_recv.insert('end', text)
#self.log('todo: [%s] recv2 insert ok' % tsnow())
self.lastRecvTicks = ts self.lastRecvTicks = ts
bg,fg='','blue'
#self.text_recv.configure(state=tkinter.NORMAL)
self.text_recv.insert('end', text)
_i1 = self.text_recv.index('end')
self.text_recv.tag_add('%s'%ts, _i0, _i1)
self.text_recv.tag_config('%s'%ts,background=bg,foreground=fg)
self.text_recv.yview('end')
#self.text_recv.configure(state=tkinter.DISABLED)
def serial_open(self): def serial_open(self):
self.entry_baud.configure(state='disabled') self.entry_baud.configure(state='disabled')
self.combobox_port.configure(state='disabled') self.combobox_port.configure(state='disabled')
@@ -84,6 +108,11 @@ class UIproc():
self.combobox_port.set(_ports[-1]) self.combobox_port.set(_ports[-1])
def clear_recvtext(self): def clear_recvtext(self):
self.text_recv.delete('1.0','end') self.text_recv.delete('1.0','end')
def save_recvtext(self):
f = tkinter.filedialog.asksaveasfile(mode='w', defaultextension='.txt', initialfile='scommlog-%s'%tsnow())
if f:
f.write(self.text_recv.get('1.0','end'))
f.close()
def log(self, s): def log(self, s):
print('[sys.log]: %s'%s) print('[sys.log]: %s'%s)
self.label_status.var.set(str(s)) self.label_status.var.set(str(s))
@@ -124,9 +153,8 @@ class SerComm():
if True: if True:
data = self.com.read(self.com.in_waiting) data = self.com.read(self.com.in_waiting)
if data: if data:
self.ui.log('recv1: %s' % strnow()) self.ui.log('%s: recv %s bytes: %s...' % (self.com.port,len(data),str(data)[:16]))
self.ui.dmesg('recv', data) self.ui.dmesg('recv', data)
self.ui.log('%s: receive: %s' % (self.com.port,str(data)))
time.sleep(0.050) time.sleep(0.050)
#except Exception as e: #except Exception as e:
else: else:
@@ -188,8 +216,8 @@ class SerComm():
def clearWin(self): def clearWin(self):
self.ui.clear_recvtext() self.ui.clear_recvtext()
def sendFile(self): def saveFile(self):
pass self.ui.save_recvtext()
def findSerialPort(self): def findSerialPort(self):
self.port_list = list(serial.tools.list_ports.comports()) self.port_list = list(serial.tools.list_ports.comports())
@@ -240,6 +268,7 @@ class TopWin():
if __name__ == '__main__': if __name__ == '__main__':
tkinter.ScrolledText = tkinter.scrolledtext.ScrolledText
root = tkgen.gengui.TkJson('scomm.json', title='scomm串口调试助手') root = tkgen.gengui.TkJson('scomm.json', title='scomm串口调试助手')
comm = SerComm(root) comm = SerComm(root)
wm = TopWin(root) wm = TopWin(root)
@@ -291,7 +320,7 @@ if __name__ == '__main__':
root.checkbox('ckbtn-cycle').set(0) root.checkbox('ckbtn-cycle').set(0)
root.checkbox('ckbtn-time').set(1) root.checkbox('ckbtn-time').set(1)
root.checkbox('ckbtn-sendshow').set(1) root.checkbox('ckbtn-sendshow').set(1)
root.entry('entry-split').set('50ms') root.entry('entry-split').set('100ms')
root.entry('entry-cycle').set('1000ms') root.entry('entry-cycle').set('1000ms')
root.entry('entry-baud').set('9600') root.entry('entry-baud').set('9600')
root.entry('entry-encoding').set('gbk') root.entry('entry-encoding').set('gbk')
@@ -300,10 +329,11 @@ if __name__ == '__main__':
root.button('btn-onoff', cmd=lambda:comm.openCloseSerial()) root.button('btn-onoff', cmd=lambda:comm.openCloseSerial())
root.button('btn-send', cmd=lambda:comm.sendData()) root.button('btn-send', cmd=lambda:comm.sendData())
root.button('btn-clear', cmd=lambda:comm.clearWin()) root.button('btn-clear', cmd=lambda:comm.clearWin())
root.button('btn-sendfile', cmd=lambda:comm.sendFile()) root.button('btn-savefile', cmd=lambda:comm.saveFile())
_stvar = tkinter.StringVar() _stvar = tkinter.StringVar()
root.label('label-status').textvariable=_stvar root.label('label-status').textvariable=_stvar
root.label('label-status').var =_stvar root.label('label-status').var =_stvar
#root.get('text-recv').configure(state=tkinter.DISABLED)
# 其他设置 # 其他设置
root.configure(bg='#e8e8e8') root.configure(bg='#e8e8e8')
root.lift() # 把主窗口置于最前面 root.lift() # 把主窗口置于最前面