我的问题是,我们是否可以将某个值分配/绑定到某个项目并隐藏该值(或者如果我们可以用另一种方式执行相同的操作)。
示例:假设ListCtrl上的列是“Name”和“Description”:
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参数是:
“名称”
“描述”
“Hiddendescription”
然后,用户填写此文本文本并单击按钮以创建项目,我基本上只想显示名称和描述并隐藏“HiddenDescription”但是这样做以便我以后可以使用它。
很抱歉在这篇文章中解释了一次以上,但我想确保你理解我的假装。</ p>
答案 0 :(得分: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))
然后,当您想要使用其他数据时,您只需在字典中查找正确的项目,您的数据就会在那里。
答案 1 :(得分:4)
wxListCtrl允许您将任意数据与不会显示的项目相关联 - 请阅读以下方法的文档:
wxListItem类也有GetData和SetData方法。
答案 2 :(得分:1)
您始终可以将隐藏列的宽度设置为零,这可能会达到您想要的效果。我只是在C ++(非wx)程序中尝试过,它工作正常。
答案 3 :(得分:1)
wx.ListCtrl
不允许您将python对象与wx.TreeCtrl
之类的项与其非常有用的SetPyData()
方法(以及相应的GetPyData()
)相关联。
我自己没有尝试过,但是代码here显示了如何创建一个类以将python数据与列表混合在一起。虽然我承认,但我不清楚你是如何使用它的。
也可以直接从wx.ListCtrl继承,并添加适当的方法,但我没有看到任何尝试,所以它可能比我想的更难。
或者,您可以使用SetItemData()
在每个项目中存储int,并使用该int来索引包含关联对象的dict(或列表,如果项目可靠且一致地排序)。 tgray已经展示了如何做到这一点,它也在我上面链接的页面上列出,所以我不会再重复它了。