3

我的问题是我们是否可以为某个项目分配/绑定一些值并隐藏该值(或者我们是否可以以另一种方式做同样的事情)。

示例:假设 ListCtrl 上的列是“名称”和“描述”:

self.lc = wx.ListCtrl(self, -1, style=wx.LC_REPORT)
self.lc.InsertColumn(0, 'Name')
self.lc.InsertColumn(1, 'Description')

当我添加一个项目时,我希望他们显示 Name 参数和描述:

num_items = self.lc.GetItemCount()
        self.lc.InsertStringItem(num_items, "Randomname")
        self.lc.SetStringItem(num_items, 1, "Some description here")

现在我想要做的基本上是为该项目分配一些未显示的内容,以便我稍后可以在应用程序上访问。

所以我想添加一些未显示在应用程序上但在项目值上的内容,例如:

hiddendescription = "Somerandomthing"

还是没看懂?好吧,假设我添加了一个按钮来添加一个带有其他一些 TextCtrls 的项目来设置参数,TextCtrls 参数是:

“姓名”

“描述”

“隐藏描述”

因此,用户填写此 textctrls 并单击按钮以创建项目,我基本上只想显示名称和描述并隐藏“HiddenDescription”,但这样做以便我以后可以使用它。

很抱歉在这篇文章中解释了不止 1 次,但我想确保你理解我假装在做什么。

4

4 回答 4

7

您可以保留一个单独的对象列表/字典,其中包含您想要的所有信息,并从其他数据结构中刷新 ListCtrl,而不是使用 ListCtrl 作为您的数据结构。

例如:

class MyObject(object):
    def __init__(self, name, description, hidden_description):
        self.name = name
        self.description = description
        self.hidden_description = hidden_description

然后在您的应用程序中:

def __init__(self):
    self.my_items = {}
    self.lc = wx.ListCtrl(self, -1, style=wx.LC_REPORT)
    self.lc.InsertColumn(0, 'Name')
    self.lc.InsertColumn(1, 'Description')

def addItemToMyListCtrl(self, name, description, hidden):
    new_item = MyObject(name, description, hidden)
    self.my_items[name] = new_item
    self.lc.Append((new_item.name, new_item.description))

然后,当您想使用附加数据时,您只需在字典中查找正确的项目,您的数据就会在那里。

于 2010-04-16T21:40:54.730 回答
4

wxListCtrl 允许您将任意数据与不会显示的项目相关联 - 阅读以下方法的文档:

设置项目数据

获取项目数据

查找项目数据

wxListItem 类也有GetData 和SetData 方法。

于 2010-04-16T21:27:09.343 回答
1

您始终可以将隐藏列的宽度设置为零,这可能会完成您想要的。我刚刚在 C++(非 wx)程序中尝试过它,它运行良好。

于 2010-04-16T21:00:19.783 回答
1

wx.ListCtrl不允许您将 python 对象与项目相关联,就像wx.TreeCtrl它非常有用的SetPyData()方法(和相应的GetPyData())一样。

我自己没有尝试过,但是这里有代码显示了如何创建一个类以将 python 数据与列表混合。虽然我承认,但我不清楚你打算如何使用它。

也可以直接从 wx.ListCtrl 继承,并添加适当的方法,但我在任何地方都没有看到任何尝试,所以它可能比我想象的要难。

或者,您可以只使用SetItemData()在每个项目中存储一个 int,并使用该 int 来索引包含关联对象的 dict(或列表,如果项目可靠且一致地排序)。tgray 已经展示了如何做到这一点,它也列在我上面链接的页面上,所以我不会再重复了。

于 2012-01-11T02:50:53.323 回答