wxPython:创建日志系统

时间:2019-05-27 04:12:31

标签: logging wxpython

我有一个应用程序,该应用程序在单击按钮时会调用另一个脚本。在该脚本上,我有一些想要在应用程序的wx.TextCtrl小部件上显示的打印件,但是我不知道从哪里开始。

这是脚本的示例:

#export.py

def exportData():
    #some code
    #Some prints that I would like to display on the application

这是我从应用程序中调用脚本的方式:

def loadData(self, event):
    from export import exportData
    exportData()

我有一些问题:

  1. 我认为打印无法用作日志,因此我必须使用某种日志系统。那是对的吗?我尝试使用log.write,但始终收到“未定义日志错误”。
  2. 也许直接从def loadData调用exportData()并不是最好的方法。如果是这样,正确的方法是什么?
  3. 最后,如何将打印/日志显示到应用程序的wx.TextCtrl小部件中?

如果您需要更多信息,请不要犹豫。预先感谢您的帮助。

编辑

这是我要执行的操作的极简示例代码。在main.py TextCtrl中打印“这是我的日志”。

# main.py
import wx, sys
import export

class Test(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, "Frame aka Window", size=(300, 200))
        panel = wx.Panel(self)
        log = wx.TextCtrl(panel, style=wx.TE_MULTILINE|wx.TE_READONLY)

        button = wx.Button(panel, label="Export", pos=(80, 80), size=(120, 30))

        self.Bind(wx.EVT_BUTTON, self.export, button)

        mySizer = wx.BoxSizer(wx.VERTICAL)
        mySizer.Add(button, 0, wx.ALL | wx.ALIGN_CENTER, 5)
        mySizer.Add(log, 0, wx.ALL | wx.ALIGN_CENTER, 5)

        panel.SetSizer(mySizer)


    def export(self, event):
        from export import exportData
        exportData()


if __name__ == '__main__':
    app = wx.App()
    frame = Test(parent=None, id=1)
    frame.Show()
    app.MainLoop()

和导出文件:

#export.py

def exportData():
    print("This is my log")

2 个答案:

答案 0 :(得分:1)

您可以将“ Log”创建为TextCtrl。

self.log = wx.TextCtrl(Panel, style=wx.TE_MULTILINE|wx.TE_READONLY)

如果您想添加一些内容,可以这样写:

self.log.AppendText('Your String here')

要清除它,您可以这样做:

self.log.Clear()

要更详细,我们需要查看更多代码。但这也许会对您有所帮助。

我也将导入而不是函数内部的模块顶部。

from export import exportData

def loadData(self, event):        
        exportData(yourLogData)

我不知道您的日志信息从何而来,但我认为您需要像这样将其传递给exportData:

[...]
self.log = wx.TextCtrl(Panel, style=wx.TE_MULTILINE|wx.TE_READONLY)
[...]
def exportData(self, yourLogData):
    #some code
    #Some prints that I would like to display on the application
    self.log.AppendText(yourLogData)

答案 1 :(得分:1)

首先,恭喜您对下面的语句import export进行了工程设计,这使我每次看到它都感到微笑。
您是否正在尝试这样的事情?

enter image description here

这是您修改后的代码:

# main.py
import wx, sys
from export import exportData

class Test(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, "Frame aka Window", size=(300, 200))
        panel = wx.Panel(self)
        self.log = wx.TextCtrl(panel, style=wx.TE_MULTILINE|wx.TE_READONLY, size=(180,100))
        button = wx.Button(panel, label="Export")
        self.Bind(wx.EVT_BUTTON, self.export, button)
        mySizer = wx.BoxSizer(wx.VERTICAL)
        mySizer.Add(button, 0, wx.ALL | wx.ALIGN_CENTER, 5)
        mySizer.Add(self.log, 0, wx.ALL | wx.ALIGN_CENTER, 5)
        panel.SetSizer(mySizer)

    def export(self, event):
        exportData(parent=self)

if __name__ == '__main__':
    app = wx.App()
    frame = Test(parent=None, id=1)
    frame.Show()
    app.MainLoop()

export.py

import time
import wx

def exportData(parent=None):
    if not parent:
        return
    log = []
    print("This is my log")
    parent.log.write("This is my log\n")
    #solely for the purpose of illustrating updates in real time use sleep between updates
    # and yield to the gui main loop
    # in real time operation remove the sleep commands
    wx.Yield()
    time.sleep(1)
    print("Log line 2")
    parent.log.write("Log line 2\n")
    wx.Yield()
    time.sleep(1)
    print("Log line 3")
    parent.log.write("Log line 3\n")
    wx.Yield()
    time.sleep(1)
    print("Export data has concluded")

这里发生的所有事情就是我们将parent传递给该函数,该函数允许实时进行更新。对Yield的调用会暂时将控制权传回wx.App.MainLoop,以使更新可见,否则,尽管更新已发生,但直到MainLoop收回后,结果还是看不到控制。