From a88125426641bd65719fd4998ba8eeb67832b046 Mon Sep 17 00:00:00 2001 From: Gavin Date: Mon, 6 Dec 2021 11:08:26 +0800 Subject: [PATCH] add log display --- app.py | 17 ++++++++++++ log_utils.py | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++ programmer.py | 12 ++++++++ 3 files changed, 106 insertions(+) create mode 100644 log_utils.py diff --git a/app.py b/app.py index 1b0785c..116f128 100644 --- a/app.py +++ b/app.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import wx +from log_utils import LogUtils from programmer import Programmer from settings import Settings @@ -34,16 +35,32 @@ class NrfxTool(wx.Frame): #---------------------------------------- # log显示区域 + self.log_clear_btn = wx.Button(self, label='Clear log') + self.log_clear_btn.Bind(wx.EVT_BUTTON, self.log_clear_btn_handler) + + self.log_text = wx.TextCtrl(self, + style=wx.TE_MULTILINE | wx.TE_READONLY + | wx.VSCROLL) vbox.Add(self.nb) + vbox.Add(self.log_clear_btn, flag=wx.EXPAND | wx.ALL) + vbox.Add(self.log_text, proportion=1, flag=wx.EXPAND | wx.ALL) self.SetSizerAndFit(vbox) self.SetSize(self.settings.size) self.Centre() self.Show(True) + # 实例化log模块,绑定输出到log显示区域 + self.logger = LogUtils.sharedInstance('1') + LogUtils.sharedInstance('nrfx_tool').set_ctrl_to_logging(self.log_text) + self.logger.set_logger('nrfx_tool', 'logs') + print(self.nb.GetSize()) + def log_clear_btn_handler(self, e): + self.log_text.Clear() + def main(): app = wx.App() diff --git a/log_utils.py b/log_utils.py new file mode 100644 index 0000000..bae66f2 --- /dev/null +++ b/log_utils.py @@ -0,0 +1,77 @@ +# -*- coding:utf-8 -*- + +import wx +import logging +import os +import time +from pathlib import Path + + +class TextHandler(logging.Handler): + def __init__(self) -> None: + logging.Handler.__init__(self) + self.ctrl = None + + def set_ctrl(self, ctrl): + self.ctrl = ctrl + + def emit(self, record): + if not self.ctrl == None: + wx.CallAfter(self.ctrl.write, self.format(record) + "\n") + + +class LogUtils(object): + log = None + + # 实现一个静态方法实例 + @staticmethod + def sharedInstance(task_id): + if LogUtils.log == None: + LogUtils.log = LogUtils(task_id) + return LogUtils.log + + def __init__(self, task_id) -> None: + self.logger = logging.getLogger(task_id) + self.level = logging.INFO + self.fmt = logging.Formatter('%(asctime)s %(levelname)s: %(message)s') + self.text_ctrl = None + self.text_handler = TextHandler() + + def set_logger(self, task_id, log_path, log_name=''): + '''log目录设置''' + if not os.path.exists(log_path): + os.makedirs(log_path) + + if log_name == '': + log_name = '%s_%s.log' % (task_id, int(time.time())) + + logs_folder = Path(log_path) + logs_path = logs_folder / log_name + print(logs_path) + + # 文件句柄 + fh = logging.FileHandler(logs_path) + # 设置格式 + fh.setFormatter(self.fmt) + # 添加文件输出流 + self.logger.addHandler(fh) + + # 输出到控制台 + sh = logging.StreamHandler() + # 设置格式 + sh.setFormatter(self.fmt) + # 添加标准输出流 + self.logger.addHandler(sh) + + # 自定义log重定向 + self.logger.addHandler(self.text_handler) + self.logger.setLevel(logging.INFO) + self.logger.info(u'Logging start.\n') + + def info(self, s): + self.logger.info(s) + + def set_ctrl_to_logging(self, text_ctrl): + self.text_ctrl = text_ctrl + if not self.text_handler == None: + self.text_handler.set_ctrl(self.text_ctrl) diff --git a/programmer.py b/programmer.py index 0bf7207..18effe8 100644 --- a/programmer.py +++ b/programmer.py @@ -1,4 +1,5 @@ import wx +from log_utils import LogUtils from settings import Settings @@ -9,6 +10,9 @@ class Programmer(wx.Panel): self._init_ui() + # 实例化log模块 + self.logger = LogUtils.sharedInstance('2') + def _init_ui(self): # 最底层水平布局vbox self.vbox = wx.BoxSizer(wx.VERTICAL) @@ -176,9 +180,17 @@ class Programmer(wx.Panel): self.setting_sbox_sizer.Add(self.setting_gbs) #------------------------------------------------ + #------------------------------------------------ + # 按键绑定 + self.erase_all_btn.Bind(wx.EVT_BUTTON, self._erase_all_btn_handler) + #------------------------------------------------ + self.vbox.Add(self.file_sbox_sizer) self.vbox.Add(self.setting_sbox_sizer) self.SetSizerAndFit(self.vbox) print(self.file_sbox.GetSize()) print(self.setting_sbox.GetSize()) + + def _erase_all_btn_handler(self, e): + self.logger.info('_erase_all_btn_handler') -- GitLab