Как сделать что-то вроде окна журнала в wxPython - PullRequest
5 голосов
/ 31 марта 2011

Я предполагаю, что это возможно с многострочным текстовым полем, но не уверен, как это сделать. Я хочу создать окно регистрации в моей программе wxPython, где я могу писать ему сообщения, когда происходят определенные действия. Кроме того, мне нужно писать сообщения не только когда происходит событие, но и определенное время в коде. Как мне заставить его перерисовать окно, чтобы сообщения появлялись в этот момент?

Ответы [ 2 ]

5 голосов
/ 31 марта 2011

Я написал статью о подобных вещах пару лет назад:

http://www.blog.pythonlibrary.org/2009/01/01/wxpython-redirecting-stdout-stderr/

3 голосов
/ 31 марта 2011

Если вы хотите просто диалог журнала в wxpython, используйте 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()

Где bShow в wx.LogWindow, если он изначально показан или нет. Это будет хорошо регистрировать все ваши сообщения wx.LogX, которые вы можете вызвать, и все равно будет передавать их любым другим обработчикам.

Другой метод, который вы могли бы использовать, это войти в систему с python, а затем, после открытия фрейма / окна с текстовым элементом управления, использовать LoadFile, чтобы открыть файл журнала:

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

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

Тогда при создании где-нибудь wx.TextCtrl:

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

EDIT: Теперь это работает с событием _on_close! Спасибо Фениксо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...