【问题标题】:How to make something like a log box in wxPython如何在 wxPython 中制作类似日志框的东西
【发布时间】:2011-07-26 12:35:26
【问题描述】:

我假设多行文本框可以做到这一点,但不知道该怎么做。我要做的是在我的 wxPython 程序中创建一个日志框,当某些操作发生时,我可以在其中向它写入消息。此外,我不仅需要在事件发生时编写消息,还需要在代码中的某些时间编写消息。我如何让它重绘窗口,以便消息在那一刻出现?

【问题讨论】:

  • 您遇到的具体问题是什么?你试过什么?
  • 我在自己的应用程序中做过类似的事情。这是基础知识:我在我的应用程序中使用了 GTK,创建了 gtkTextBuffer,并将其分配给 textArea。我将更多文本添加到缓冲区,GTK 本身将其打印到 textArea 中。我认为在 WX 中应该有类似的东西。或者,也许您可​​以在您的应用中创建 textarea 并将文本附加到它

标签: python logging wxpython


【解决方案1】:

几年前我写了一篇关于这类事情的文章:

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

【讨论】:

    【解决方案2】:

    如果你只想要 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()
    

    wx.LogWindow 中的 bShow 表示它最初是否显示。这将很好地记录您可以触发的所有 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')
    

    编辑: 这现在适用于 _on_close 事件!谢谢费尼克索

    【讨论】:

    • 在我的设置(Windows-XP-SP3、Python 2.7.1、wxPython 2.8.11.0)中,它崩溃并显示“python.exe 遇到问题并需要关闭”。关闭。不知道为什么。
    • 嗯。这个不承认的概念对我来说看起来很奇怪。我做了一点另一种更直接的方式。我基本上把log_window移出了MainWindow,所以它是独立的,然后给MainWindow引用log_window。
    猜你喜欢
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    相关资源
    最近更新 更多