在使用 wxPython 开发程序时,我们经常需要对代码进行修改以调整界面或功能。通常的做法是编写代码,运行应用程序,注意到边框大小差了几像素,关闭程序,进行微调,重复此过程,直到看起来正确。这种方法显然效率低下。假设我们需要对界面进行微调,如果没有必要反复关闭/重新打开程序,那将会轻松许多。
2、解决方案
我们可以使用 Python 的 reload() 内置功能来实现代码的实时修改。
以下是一个示例演示:
import testApp
import wx
########################################################################
class ReloaderPanel(wx.Panel):
""""""
#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent)
self.testFrame = None
showAppBtn = wx.Button(self, label="Show App")
showAppBtn.Bind(wx.EVT_BUTTON, self.onShowApp)
reloadBtn = wx.Button(self, label="Reload")
reloadBtn.Bind(wx.EVT_BUTTON, self.onReload)
mainSizer = wx.BoxSizer(wx.VERTICAL)
mainSizer.Add(showAppBtn, 0, wx.ALL|wx.CENTER, 5)
mainSizer.Add(reloadBtn, 0, wx.ALL|wx.CENTER, 5)
self.SetSizer(mainSizer)
#----------------------------------------------------------------------
def onReload(self, event):
"""
Reload the code!
"""
if self.testFrame:
self.testFrame.Close()
reload(testApp)
self.showApp()
else:
self.testFrame = None
#----------------------------------------------------------------------
def onShowApp(self, event):
"""
Show the app
"""
self.showApp()
#----------------------------------------------------------------------
def showApp(self):
"""
"""
self.testFrame = testApp.TestFrame()
########################################################################
class ReloaderFrame(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, title="Reloader")
panel = ReloaderPanel(self)
self.Show()
if __name__ == "__main__":
app = wx.App(False)
frame = ReloaderFrame()
app.MainLoop()
相应的 testApp 脚本可以进行编辑:
import wx
########################################################################
class TestPanel(wx.Panel):
""""""
#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent)
########################################################################
class TestFrame(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, title="Test program")
panel = TestPanel(self)
self.Show()
if __name__ == "__main__":
app = wx.App(False)
frame = TestFrame()
app.MainLoop()
保存第二个脚本为 testApp.py。现在,如果我们编辑第二个脚本并点击第一个脚本中的 Reload 按钮,就可以看到我们的更改。