Logging wxPython:创建日志系统
我有一个应用程序,它在单击按钮时调用另一个脚本。在这个脚本上,我有一些打印,我想显示在应用程序的wx.TextCtrl小部件上,但我不知道从哪里开始 这是一个脚本示例,名为: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
#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()
我有一些问题:
# 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次迭代后停止工作。你知道它可能是什么吗?再次感谢你。多线程是另一回事。所有更新都必须在wxMainLoop
中进行,因此你必须使用类似于pubsub
的东西来启动events在线程中,将被更新必须发生的MainLoop
捕获。感谢您的帮助,这是最接近我想要的结果。但是,我唯一的问题是,日志是在函数完成时添加的,我希望它是实时的,这就是日志的含义:)我看到的唯一解决方案是使用SQLite db,如果您有更好的解决方案,请不要犹豫,您在问题中忽略了该细节。一种方法是将父级
传递给函数,并从函数内部执行更新。请参阅我编辑的答案。谢谢您的回答。它在我的脚本上非常有效,但奇怪的是,它没有为同一个脚本工作usnig多线程。似乎该脚本在2或3次迭代后停止工作。你知道它可能是什么吗?再次感谢你。多线程是另一回事。所有更新都必须在wxMainLoop
中进行,因此你必须使用类似于pubsub
的东西来启动eve必须进行更新的MainLoop
将捕获的线程中的nts。