应用程序冻结日志重定向

时间:2014-06-16 09:43:06

标签: python multithreading logging wxpython

ALL,

我试图将python日志重定向到wxPython GUI。这是我的代码:

class Redirect(object):
    def __init__(self, textctrl):
        self.out = textctrl

    def write(self, string):
        evt = UpdateLogCommandEvent(status=msg, peer=self)
        wx.PostEvent(self.out.GetEventHandler(), evt)

class LoggingRedirectHandler(logging.StreamHandler):
    def __init__(self,dialog):
        logging.StreamHandler.__init__( self )
        self.textctrl = dialog

    def emit(self, record):
        msg = self.format( record )
        stream = self.stream
        evt = UpdateLogCommandEvent(status=msg, peer=self)
        wx.PostEvent(self.textctrl.GetEventHandler(), evt)

class Executor(wx.Dialog):
    def __init__(self, parent, ID, title, options, path_spec):
        self.options = options
        self.path_spec = path_spec
        wx.Dialog.__init__( self, parent, ID, title, size=(600,600) )
        sizer1 = wx.BoxSizer( wx.VERTICAL )
        self.log = wx.TextCtrl( self, size=(800,800), style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL )
        sizer1.Add( self.log, 1, wx.EXPAND, 0 )
        self.SetSizer( sizer1 )
        sizer1.Fit( self )
        self.Bind(EVT_UPDATE_LOG_COMMAND_EVENT, self.OnUpdateLog)

    def OnUpdateLog(self, event):
        message = event.status
        peer = event.peer
        wx.CallAfter(self.log.WriteText, message + "\n" )
        #wx.Yield()

    def OnShowExecutor(self, logLevel):
        format_str = "[%(levelname)s] %(message)s"
        logging.basicConfig( level=logLevel, format=format_str )
        self.logger = logging.getLogger()
        self.logger.setLevel(logLevel)
        redir = Redirect(self)
        sys.stdout = redir
        sys.stderr = redir
        logger_stream_handler = LoggingRedirectHandler(self)
        self.logger.addHandler( logger_stream_handler )
        self.Show()
        logging.info("Logging check")

我遇到的问题是日志来自另一个进程'线程。因此,当我在新创建的记录器中发送日志消息时,应用程序将无响应。

进程和线程正在执行,日志消息也会进入控制台,因此我可以告诉应用程序正常工作。

现在代码使用wx.ProgressDialog()之前没有GUI冻结。我的猜测是进度对话框在其自己的线程上运行,并且它被称为wx.Yield()以确保更新GUI。

现在我尝试在我的代码中调用wx.Yield(),以便让GUI处理它在队列中的消息/事件,但结果相同 - GUI冻结。

我在这里缺少什么?如何解冻GUI部分?

谢谢。

P.S。:我在WinXP SP3上使用wxPython-3.0.0 classic和python-2.7。但是在具有相同python / wxPython版本的较新的WIndows 7/8机器上也会发生同样的情况。

P.P.S。 [编辑]我为代码格式化道歉。出于某种原因,SO拧紧了代码格式,并没有保留空格。对于那个很抱歉。 [/编辑]

0 个答案:

没有答案