2010-04-16 49 views
3

我的問題是,如果我們可以分配/綁定某個值到某個項目並隱藏該值(或者如果我們可以用另一種方式做同樣的事情)。ListCtrl - wxPython/Python

例子:比方說對的ListCtrl列是「名稱」和「說明」:

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

當我增加一個項目,我希望他們以顯示名稱參數和說明:

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」

然後用戶填充這個文本框並點擊按鈕來創建該項目,我基本上只想顯示名稱和描述,並隱藏「隱藏描述」,但是這樣做以後我可以使用它。

對不起,在這篇文章上解釋了一次以上,但我想確保你明白我假裝要做的事情。

回答

4

的wxListCtrl可以讓你任意數據與項目,將不被顯示關聯 - 閱讀文檔以下方法:

SetItemData

GetItemData

FindItemData

的wxListItem類也有GetData和SetData方法。

+0

我不知道這件事,非常感謝您的幫助! – dpswt 2010-04-16 21:54:17

+0

除非我遺漏了一些東西,這不會讓你關聯任意數據,它可以讓你關聯一個整數。如果使用[tgray解決方案](http://stackoverflow.com/a/2656249/665488),這隻對'任意數據'有用。 – 2012-01-11 02:45:43

+0

@Cam:你說得對。如果你需要存儲一個任意的python對象,你需要把它放在一個字典中並存儲密鑰。 wxPython wiki上的[This page](http://wiki.wxpython.org/ListControls)有一個mixin類,它添加了一個SetPyData方法來自動執行此操作。它缺少GetPyData和FindPyData方法,但它們很容易添加。 – 2012-01-12 08:02:59

1

您可以隨時將隱藏列的寬度設置爲零,以實現您想要的效果。我只是在C++(非wx)程序中試過,並且它工作正常。

+0

嗯,感謝您的幫助,如果沒有什麼問題,這將是一個好主意,當我調整Description列的大小時,它似乎會調整Description列和hiddendescription列的大小以顯示信息...不過謝謝! – dpswt 2010-04-16 21:05:28

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)) 

然後,當你想用你額外的數據你可以查找正確的項目,在字典中查看資料在那裏。

+0

沒有想到這個,非常感謝,我會嘗試這種方法! – dpswt 2010-04-16 21:57:04

1

wx.ListCtrl不會讓你一個Python對象與項目一樣wx.TreeCtrl相關聯憑藉其極爲有用SetPyData()方法(和相應的GetPyData())一樣。

我還沒有自己嘗試過,但有代碼here,它顯示瞭如何創建一個類來與Python列表中的數據混合。雖然我承認,但我不清楚你是如何使用它的。

它也可能直接從wx.ListCtrl繼承,並添加適當的方法,但我沒有看到任何地方的任何嘗試,所以它可能比我想象的更難。

或者,您也可以使用SetItemData()在每個項目中存儲一個int,然後使用該int來索引包含關聯對象的字典(或列表,如果項目是可靠且一致地排序的)。 tgray已經展示瞭如何做到這一點,它也列在我上面鏈接的頁面上,所以我不會再重複一遍。