Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging wxPython:创建日志系统_Logging_Wxpython - Fatal编程技术网

Logging wxPython:创建日志系统

Logging wxPython:创建日志系统,logging,wxpython,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): fro

我有一个应用程序,它在单击按钮时调用另一个脚本。在这个脚本上,我有一些打印,我想显示在应用程序的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()
我有一些问题:

  • 我假设打印不能作为日志使用,我必须使用某种日志系统。对吗?我曾尝试使用log.write,但一直出现“log not defined error”
  • 可能直接从def loadData调用exportData()并不是最好的方法。如果是这样,正确的方法是什么
  • 最后,如何将打印/日志显示到应用程序的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()
    
    self.log = wx.TextCtrl(Panel, style=wx.TE_MULTILINE|wx.TE_READONLY)
    
    和导出文件:

    #export.py
    
    def exportData():
        print("This is my log")
    
    您可以创建一个“日志”作为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()
    
    self.log = wx.TextCtrl(Panel, style=wx.TE_MULTILINE|wx.TE_READONLY)
    
    如果你想添加一些东西,你可以这样写:

    self.log.AppendText('Your String here')
    
    self.log.Clear()
    
    [...]
    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)
    
    要清除它,请执行以下操作:

    self.log.AppendText('Your String here')
    
    self.log.Clear()
    
    [...]
    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)
    
    为了更详细,我们需要看到更多的代码。但也许这已经对你有所帮助了

    此外,我会在模块顶部导入,而不是在函数内部

    from export import exportData
    
    def loadData(self, event):        
            exportData(yourLogData)
    
    我不知道您日志的信息来自何处,但我假设您需要将其传递到exportData,如下所示:

    self.log.AppendText('Your String here')
    
    self.log.Clear()
    
    [...]
    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)
    
    您可以创建一个“日志”作为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()
    
    self.log = wx.TextCtrl(Panel, style=wx.TE_MULTILINE|wx.TE_READONLY)
    
    如果你想添加一些东西,你可以这样写:

    self.log.AppendText('Your String here')
    
    self.log.Clear()
    
    [...]
    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)
    
    要清除它,请执行以下操作:

    self.log.AppendText('Your String here')
    
    self.log.Clear()
    
    [...]
    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)
    
    为了更详细,我们需要看到更多的代码。但也许这已经对你有所帮助了

    此外,我会在模块顶部导入,而不是在函数内部

    from export import exportData
    
    def loadData(self, event):        
            exportData(yourLogData)
    
    我不知道您日志的信息来自何处,但我假设您需要将其传递到exportData,如下所示:

    self.log.AppendText('Your String here')
    
    self.log.Clear()
    
    [...]
    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)
    

    首先,祝贺你设计了以下语句
    导入导出
    ,每次看到它都让我微笑。
    你在尝试这样的事情吗

    以下是您修改后的代码:

    # 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")
    

    这里所发生的一切就是我们将
    父对象
    传递给函数,从而允许实时进行更新。对
    Yield
    的调用会将控制权瞬间传递回
    wx.App.MainLoop
    ,以便看到更新发生,否则,尽管更新发生了,但结果不会被看到,直到
    MainLoop
    收回控制权

    首先,祝贺你设计了下面的声明
    导入导出
    ,每次看到它我都会笑。
    你在尝试这样的事情吗

    以下是您修改后的代码:

    # 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")
    

    这里所发生的一切就是我们将
    父对象
    传递给函数,从而允许实时进行更新。对
    Yield
    的调用会将控制权瞬间传递回
    wx.App.MainLoop
    ,以便看到更新发生,否则,尽管更新发生了,但结果不会被看到,直到
    MainLoop
    收回控制权

    对不起,我迟到了,但我不得不做一些测试,不幸的是我错过了一些东西,因为它对我不起作用:(我用一个极简主义的例子编辑了我的初始问题,这样你就可以看到我在尝试做什么。谢谢你的帮助。非常感谢。很抱歉迟到了,但我不得不做一些测试,不幸的是,我遗漏了一些东西,因为它对我不起作用:(我用一个最简单的例子编辑了我的初始问题,这样你就可以看到我在做什么。谢谢你的帮助。非常感谢。谢谢你的帮助,这是最接近我想要的结果。但是,我唯一的问题是,日志是在函数完成时添加的,我希望它是实时的,这就是日志对b的意义。)e:)我看到的唯一解决方案是使用SQLite db,如果您有更好的解决方案,请不要犹豫,您在问题中忽略了该细节。一种方法是将
    父级
    传递给函数,并从函数内部执行更新。请参阅我编辑的答案。谢谢您的回答。它在我的脚本上非常有效,但奇怪的是,它没有为同一个脚本工作usnig多线程。似乎该脚本在2或3次迭代后停止工作。你知道它可能是什么吗?再次感谢你。多线程是另一回事。所有更新都必须在wx
    MainLoop
    中进行,因此你必须使用类似于
    pubsub
    的东西来启动events在线程中,将被更新必须发生的
    MainLoop
    捕获。感谢您的帮助,这是最接近我想要的结果。但是,我唯一的问题是,日志是在函数完成时添加的,我希望它是实时的,这就是日志的含义:)我看到的唯一解决方案是使用SQLite db,如果您有更好的解决方案,请不要犹豫,您在问题中忽略了该细节。一种方法是将
    父级
    传递给函数,并从函数内部执行更新。请参阅我编辑的答案。谢谢您的回答。它在我的脚本上非常有效,但奇怪的是,它没有为同一个脚本工作usnig多线程。似乎该脚本在2或3次迭代后停止工作。你知道它可能是什么吗?再次感谢你。多线程是另一回事。所有更新都必须在wx
    MainLoop
    中进行,因此你必须使用类似于
    pubsub
    的东西来启动eve必须进行更新的
    MainLoop
    将捕获的线程中的nts。