wxPython:创建一个日志系统
wxPython: Create a log system
我有一个应用程序在单击按钮时调用另一个脚本。在该脚本上,我有一些打印件想显示在应用程序的 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()
我有一些问题:
- 我假设 print 不能用作日志,我必须使用某种日志系统。那是对的吗?我尝试使用 log.write 但我一直收到 "log not defined error".
- 也许直接从 def loadData 调用 exportData() 并不是最好的方法。如果是这样,正确的做法是什么?
- 最后,如何将 prints/logs 显示到应用程序的 wx.TextCtrl 小部件中?
如果您需要更多信息,请不要犹豫。预先感谢您的帮助。
编辑
这是我正在尝试做的一个极简主义工作示例代码。在 main.py TextCtrl 中打印 "This is my log"。
# 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")
您可以创建一个 "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)
首先,祝贺您设计了以下语句import export
,每次看到它都会让我微笑。
你在尝试这样的事情吗?
这是您修改后的代码:
# 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
传递给函数,这允许在 real-time 中进行更新。对 Yield
的调用会暂时将控制权交还给 wx.App.MainLoop
,以便可以看到更新的发生,否则,尽管发生了更新,但结果是看不到的,直到 MainLoop
收回控制。
我有一个应用程序在单击按钮时调用另一个脚本。在该脚本上,我有一些打印件想显示在应用程序的 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()
我有一些问题:
- 我假设 print 不能用作日志,我必须使用某种日志系统。那是对的吗?我尝试使用 log.write 但我一直收到 "log not defined error".
- 也许直接从 def loadData 调用 exportData() 并不是最好的方法。如果是这样,正确的做法是什么?
- 最后,如何将 prints/logs 显示到应用程序的 wx.TextCtrl 小部件中?
如果您需要更多信息,请不要犹豫。预先感谢您的帮助。
编辑
这是我正在尝试做的一个极简主义工作示例代码。在 main.py TextCtrl 中打印 "This is my log"。
# 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")
您可以创建一个 "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)
首先,祝贺您设计了以下语句import export
,每次看到它都会让我微笑。
你在尝试这样的事情吗?
这是您修改后的代码:
# 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
传递给函数,这允许在 real-time 中进行更新。对 Yield
的调用会暂时将控制权交还给 wx.App.MainLoop
,以便可以看到更新的发生,否则,尽管发生了更新,但结果是看不到的,直到 MainLoop
收回控制。