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拧紧了代码格式,并没有保留空格。对于那个很抱歉。 [/编辑]