2017-06-20 5 views
1

私は約110のユーザ選択パラメータを持つwxpythonを使ってGUIアプリケーションを開発しています。ユーザーがこれらのオプションをプロジェクトファイルに保存できるようにしたいので、wxPythonに含まれているPersistenceManagerモジュールを使用することにしました。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オブジェクトを使用して試してみたが、これは何の違いを行いません。面白いことに、ウィンドウの__init__関数内にself.__persistMgrオブジェクトを宣言し、そこにハードコーディングされたファイル名でSetPersistenceFileメソッドを使用すると、ファイルが書き込まれますが、これは実行時にユーザーが指定する必要があるため役に立ちません。

誰もファイルが保存されていない理由を知っていますか、どのように修正できますか?

答えて

0

あなたのコードがなぜあなたに悲しみを与えているのか分かりませんが、Linuxでは以下のように動作しますが、それはあなたには慰安ではないかもしれません。
これは、自分自身PersistenceManagerを渡って来ていない、いくつかのソースから一緒に石畳されています。

[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の設定これは、それはあなたが永続化のために保存されていることである何の真のようになります。私の.prjファイルに

#!/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() 

結果。

編集:あなたのコメントに関して 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

は私が絶望的に​​間違っている可能性が、私はそれを使用していません。

+0

ありがとうございます。この例ではうまく動作しますが、別の関数(私がしようとしているように)に置くと、フレームプロパティをキャプチャするように見えますが、コントロールという名前の子は表示されません。どこに置いても、子コントロールは正しく保存されます。 – PowerSystemsDev

+0

オリジナルの回答への参照を追加しました –

関連する問題