wxPython - 在ListCtrl中保存项目

2 投票
1 回答
1298 浏览
提问于 2025-04-15 21:45

我想问的是,我们能不能把ListCtrl里的项目保存下来,这样每次有人打开应用程序时,这些项目就会显示出来。如果用户删除了某个项目,它也能从配置中删除。我知道可以使用wx.Config来实现这个功能,但我不知道该怎么读取它才能达到我的目的。

所以我想了解的是,如何正确地写入和读取wx.Config,以确保每次打开应用程序时,ListCtrl里的项目都能显示出来。

谢谢大家的帮助。

1 个回答

3

使用 wx.Config 非常简单,你只需要创建一个配置,传入你应用的名字,然后添加一些数据,比如:

config = wx.Config("StackOverflowTest")
config.Write("testdata", "yes it works!")

现在你可以随时读取这些数据了。

config = wx.Config("StackOverflowTest")
print config.Read("testdata")

为了保存列表控制的数据,我建议你先把所有数据读到一个 Python 列表中,然后把这个列表保存到配置里。下次读取配置时,再把数据取出来并填充到列表中。为了结构清晰,可以添加一些函数,比如 fillList 和 saveList,这样你就能确保读取和写入的部分是相近且相似的。

例如,你可以使用这个基本框架:

import wx
import cPickle

class MyListCtrl(wx.ListCtrl):

    def __init__(self, *args, **kwargs):
        wx.ListCtrl.__init__(self, *args, **kwargs)
        self.config = wx.Config("MykoolApp")

        self.fillist()

    def filllist(self):
         # load rows and check for error too, if no data
        data = self.config.Read("list_cntrl_data")
        rowList = cPickle.loads(data)

        for row in rowList:
            # add this row to list cntrl
            pass

    def savelist(self):
        rows = []
        for row in self:
            # add data to rows
            pass

        data =  cPickle.dumps(rows)
        self.config.Write("list_cntrl_data", data)

    def onchange(self):
        """
        on changes to list e.g. add delete call save list
        """
        self.savelist()

撰写回答