2011-03-31 10 views
5

Supongo que esto es posible con un cuadro de texto de líneas múltiples, pero no estoy seguro de cómo hacerlo. Lo que estoy buscando hacer es crear un cuadro de registro en mi programa wxPython, donde puedo escribir mensajes cuando ocurren ciertas acciones. Además, necesito escribir los mensajes no solo cuando ocurre un evento, sino también ciertas veces en el código. ¿Cómo podría redibujar la ventana para que los mensajes aparezcan en ese instante?Cómo hacer algo como una caja de registro en wxPython

+1

Específicamente, ¿qué estás teniendo problemas con? ¿Qué has intentado? – Philip

+0

He hecho algo así en mi propia aplicación. aquí es básico: he usado GTK para mi aplicación, he creado gtkTextBuffer y lo he asignado a textArea. Agrego más texto al buffer, y GTK lo imprime en textArea. Creo que en WX debería haber algo así. O tal vez puedas crear un área de texto en tu aplicación y anexarle texto – Lixas

Respuesta

3

Si desea sólo una diálogo de registro en wxpython, utilice wx.LogWindow:

import wx 

class MainWindow(wx.Frame): 

    def __init__(self, parent=None): 
     wx.Frame.__init__(self, parent, wx.NewId(), 'Logging') 

     self.log_window = wx.LogWindow(self, 'Log Window', bShow=True) 

     box_sizer = wx.BoxSizer(orient=wx.VERTICAL)   
     show_log_button = wx.Button(self, wx.NewId(), 'Show Log') 
     show_log_button.Bind(wx.EVT_BUTTON, self._show_log)   

     log_message_button = wx.Button(self, wx.NewId(), 'Log Message') 
     log_message_button.Bind(wx.EVT_BUTTON, self._log_message) 

     box_sizer.AddMany((show_log_button, log_message_button)) 
     self.SetSizer(box_sizer) 
     self.Fit() 

     self.Bind(wx.EVT_CLOSE, self._on_close) 

    def _show_log(self, event): 
     self.log_window.Show() 

    def _log_message(self, event): 
     wx.LogError('New error message') 

    def _on_close(self, event): 
     self.log_window.this.disown() 
     wx.Log.SetActiveTarget(None) 
     event.Skip() 

if __name__ == '__main__': 
    app = wx.PySimpleApp() 
    dlg = MainWindow() 
    dlg.Show() 
    app.MainLoop() 

Dónde bShow en wx.LogWindow es, si se muestra o no inicialmente. Esto registrará muy bien todos los mensajes wx.LogX que puede activar, y aún así los pasa a otros manejadores.

Otro método que podría utilizar sería que conectarse con un pitón y luego, al abrir un marco/ventana con un control de texto en él, utilizar LoadFile para abrir el archivo de registro:

import logging 
LOG_FILENAME = 'example.log' 
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG) 

logging.debug('This message should go to the log file') 

Entonces, cuando se crea un wx.TextCtrl alguna parte:

log_control = wx.TextCtrl(self, wx.NewId(), style=wx.TE_MULTILINE|wx.TE_READONLY) 
log_control.LoadFile('example.log') 

EDIT: Este ahora trabaja con el evento _on_close! Gracias Fenikso

+0

En mi configuración (Windows-XP-SP3, Python 2.7.1, wxPython 2.8.11.0) falla con "python.exe ha encontrado un problema y debe cerrarse" " de cerca. No estoy seguro por qué. – Fenikso

+0

¡Esto ya está arreglado! – Iacks

+0

Hmmm. Este concepto de despropósito me parece extraño. Lo hice un poco más y de una manera más directa. Básicamente moví el log_window fuera de MainWindow, por lo que es independiente, y luego le di a MainWindow la referencia a log_window. – Fenikso

Cuestiones relacionadas