是否存在用于存储桌面应用程序设置的跨平台约定/位置?

时间:2014-11-30 05:01:46

标签: python wxpython jython configuration-files

作为我使用Python开发桌面GUI应用程序的第一个项目的一部分,是否有标准或传统的位置或存储应用程序默认值的方法?作为示例,可能存在诸如应用程序使用的图标或其他图像之类的资源,其不应存储在源树中。

使用特定于用户的配置文件,可以直接将默认配置目录设置为'〜/ .app_config'并使用os.path.expanduser()在Windows和Linux上生成适当的路径(忽略最近版本的Windows存储设置"〜/ Application Data"或"〜/ Local设置")用户级配置很好,但我在专业打包的应用程序中寻找资源存储的语言或工具包约定。

我目前正在使用Jython,但这应该适用于wxPython,其他GUI工具包和CLI应用程序。我很欣赏我的灵活性,但坦率地说,我想把事情放在一个标准的#34;地点和我太懒了,不够傲慢,只能弥补什么"标准"是。 :)

更新 appdirs模块似乎完全符合我的要求。回想起来,我发现this questionthis question基本上是重复的。

1 个答案:

答案 0 :(得分:1)

您应该使用wx.StandardPaths。 wxPython演示中有一个很好的例子。我拿了那个例子并在下面创建了一个可运行的版本:

import wx

#----------------------------------------------------------------------
class TestPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)

        sizer = wx.FlexGridSizer(0, 3, 5, 5)
        sizer.AddGrowableCol(1)
        box = wx.BoxSizer(wx.VERTICAL)
        fs = self.GetFont().GetPointSize()
        bf = wx.Font(fs+4, wx.SWISS, wx.NORMAL, wx.BOLD)

        t = wx.StaticText(self, -1, "StandardPaths")
        t.SetFont(bf)
        box.Add(t, 0, wx.CENTER|wx.ALL, 4)
        box.Add(wx.StaticLine(self, -1), 0, wx.EXPAND)

        # get the global (singleton) instance of wx.StandardPaths
        sp = wx.StandardPaths.Get()

        # StandardPaths will use the value of wx.App().GetAppName()
        # for some of the stnadard path components.  Let's set it to
        # something that makes that obvious for the demo.  In your own
        # apps you'll set it in to something more meaningfull for your
        # app in your OnInit, (or just let it default.)
        wx.GetApp().SetAppName("AppName")

        self.help = {}

        # Loop through all of the getters in wx.StandardPaths and make
        # a set of items in the sizer for each.
        def makeitem(name, *args):
            func = getattr(sp, name)
            sizer.Add(wx.StaticText(self, -1, "%s%s:" %(name, repr(args))),
                      0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL)
            sizer.Add(wx.TextCtrl(self, -1, func(*args),
                                  size=(275,-1), style=wx.TE_READONLY),
                      0, wx.EXPAND|wx.ALIGN_CENTER_VERTICAL)

            btn = wx.Button(self, wx.ID_HELP)
            sizer.Add(btn)
            self.help[btn] = func.__doc__

        for x in ['GetConfigDir',
                  'GetUserConfigDir',
                  'GetDataDir',
                  'GetLocalDataDir',
                  'GetUserDataDir',
                  'GetUserLocalDataDir',
                  'GetDocumentsDir',
                  'GetPluginsDir',
                  'GetInstallPrefix',
                  'GetResourcesDir',
                  'GetTempDir',
                  'GetExecutablePath',
                  ]:
            makeitem(x)

        # this one needs parameters
        makeitem('GetLocalizedResourcesDir', 'en',
                 wx.StandardPaths.ResourceCat_Messages )

        self.Bind(wx.EVT_BUTTON, self.OnShowDoc, id=wx.ID_HELP)

        box.Add(sizer, 0, wx.CENTER|wx.EXPAND|wx.ALL, 20)
        self.SetSizer(box)

    def OnShowDoc(self, evt):
        doc = self.help[evt.GetEventObject()]

        # trim the whitespace from each line
        lines = []
        for line in doc.split('\n'):
            lines.append(line.strip())
        doc = '\n'.join(lines)
        wx.TipWindow(self, doc, 500)    

#----------------------------------------------------------------------
class MyFrame(wx.Frame):
    """"""

    def __init__(self):
        wx.Frame.__init__(self, None, title="Standard Paths",
                          size=(800,600))
        panel = TestPanel(self)
        self.Show()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()

有关详细信息,建议您阅读文档: