我正在使用wxpython开发一个GUI应用程序,该应用程序有大约110个用户选择的参数。由于我希望用户能够将这些选项保存到项目文件中,因此我决定使用wxPython中包含的PersistenceManager模块。
只要我不尝试指定保存设置的文件名,即使用默认值(C:\users\username\AppData\programName\Persistence_Options
),持久性很有效,只需让程序保存设置它会退出。
我要做的是允许用户选择一个文件来保存设置(因为他们可能有多个具有不同选项的项目)。但是,当我使用SetPersistenceFile
方法和用户指定的文件名时,没有文件被保存,并且没有返回错误消息,即使它肯定正在执行下面给出的那些代码行。 (OnSave
函数是程序主窗口的一种方法。)
def OnSave(self, e):
self.dirname = os.getcwd()
if self.ProjectFile == '':
dlg = wx.FileDialog(self, "Save project file", self.dirname, "", "Project configuration file (.prj)|*.prj", wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
if dlg.ShowModal() == wx.ID_CANCEL:
return
else:
self.ProjectFile = os.path.join(dlg.GetDirectory(), dlg.GetFilename())
#print self.ProjectFile
if self.ProjectFile != '':
print "Made it to here (Save)..."
#self.Register(self) # Also tried calling Register in __init__
self._persistMgr = PM.PersistenceManager.Get()
print self.ProjectFile # Gives correct filename
self._persistMgr.SetPersistenceFile(self.ProjectFile)
self._persistMgr.Save(self)
print "Finished saving."
我尝试使用本地PersistenceManager对象,而不是将其作为类成员,这没有任何区别。有趣的是,如果我在窗口的self.__persistMgr
函数中声明__init__
对象并使用带有硬编码文件名的SetPersistenceFile
方法,则会写入文件,但是这样做没有用。用户需要在运行时指定。
有谁知道为什么文件没有保存以及我如何解决这个问题?
答案 0 :(得分:0)
不确定为什么你的代码会让你感到悲伤,以下是在Linux上运行的,尽管这对你来说可能没什么安慰。
它是从许多来源拼凑而成的,并没有遇到PersistenceManager
我自己。
#!/usr/bin/python
import wx , os
import wx.lib.agw.persist as PM
class persist(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "A window that maintains size and position after restart")
self.Bind(wx.EVT_CLOSE, self.OnClose)
# Very important step!!
if self.GetName() == "frame":
self.SetName("My Persist Frame") # Do not use the default name!!
dirname = os.getcwd()
dlg = wx.FileDialog(self, "Project file", dirname, "", "Project configuration file (.prj)|*.prj|All files (*.*)|*.*", wx.FD_SAVE)
if dlg.ShowModal() == wx.ID_CANCEL:
_configFile = os.path.join(os.getcwd(), "persist-saved.prj") # getname()
else:
_configFile = os.path.join(dlg.GetDirectory(), dlg.GetFilename())
print _configFile
self._persistMgr = PM.PersistenceManager.Get()
self._persistMgr.SetPersistenceFile(_configFile)
self._persistMgr.RegisterAndRestoreAll(self)
self._persistMgr.Save(self)
def OnClose(self, event):
self._persistMgr.SaveAndUnregister()
event.Skip()
if __name__ == '__main__':
my_app = wx.App()
p = persist(None)
p.Show()
my_app.MainLoop()
我的.prj文件中的结果:
[Persistence_Options]
[Persistence_Options/Window]
[Persistence_Options/Window/My\ Persist\ Frame]
x=('int', '9')
y=('int', '134')
w=('int', '319')
h=('int', '78')
Maximized=('bool', 'False')
Iconized=('bool', 'False')
请注意name
的设置,无论你为持久性保存什么,这都是正确的。
编辑:关于你的评论
我认为您可能希望的目标超过PersistenceManager
能够应对的目标。
wxWidgets内置支持(不断增长的)控件数量。目前支持以下类:
wxTopLevelWindow(以及wxFrame和wxDialog) wxBookCtrlBase(即wxNotebook,wxListbook,wxToolbook和wxChoicebook) wxTreebook 要自动保存和恢复上面列出的类的窗口属性,您需要:
使用wxWindow :: SetName()为窗口设置唯一名称:此步骤很重要,因为名称在配置文件中使用,因此在同一类的所有窗口中必须是唯一的。 在创建窗口后随时调用wxPersistenceManager :: Register(),然后在可以恢复设置时调用wxPersistenceManager :: Restore()(不能总是立即完成,例如通常需要首先填充窗口)。如果可以在窗口创建后立即恢复设置(例如wxTopLevelWindow的情况),那么可以使用wxPersistenceManager :: RegisterAndRestore()来同时执行这两个操作。 如果您不希望保存窗口的设置(例如,如果取消对话框通常不保存对话框大小的更改),则需要手动调用wxPersistenceManager :: Unregister()。否则,当控制本身被销毁时,设置将自动保存 资料来源:http://www.ccp4.ac.uk/dist/checkout/wxPython-src-3.0.2.0/docs/doxygen/out/html/overview_persistence.html
当然,我可能毫无希望地错了,正如我已经承认的那样,我之前没有使用它或者正确地调查它。