Listctrl - wxpython / python
Вопрос
Мой вопрос, если мы сможем присвоить / связывать некоторое значение определенному элементу и скрыть это значение (или, если мы можем сделать то же самое другое путь).
Пример: позволяет сказать столбцы на listccrl - «name» и «описание»:
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 являются:
"Имя"
"Описание"
"Hiddendescription"
Поэтому пользователь наполняет эту текстовую кнопку и нажимает кнопку, чтобы создать элемент, и я в основном хочу только отображать имя и описание и скрыть «hiddendescription», но чтобы сделать это, чтобы я мог использовать его позже.
Извините за объяснение более 1 времени на этом посте, но я хочу убедиться, что вы понимаете, что делаете.
Решение
WXListCtrl позволяет связать произвольные данные с элементом, которые не будут отображаться - прочитайте документы для следующих методов:
Класс WXListitem также имеет методы GetData и SetData.
Другие советы
Вместо того, чтобы использовать 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))
Затем, когда вы хотите использовать свои дополнительные данные, вы можете просто посмотреть правильный элемент в словаре, и ваши данные будут там.
Вы всегда можете установить ширину скрытой колонны до нуля, что может выполнить то, что вы хотите. Я просто попробовал его в программе C ++ (не WX), и она работала нормально.
wx.ListCtrl
не позволяет вам ассоциировать объект Python с таким предметом wx.TreeCtrl
делает с его чрезвычайно полезным SetPyData()
метод (и соответствующий GetPyData()
).
Я не пробовал это сам, но есть код здесь Это показывает, как создать класс для смешивания в данных Python со списком. Хотя я признаю, мне не понятно, как вы должны использовать его.
Также может быть возможно непосредственно унаследовать от wx.listctrl и добавить соответствующие методы, но я не видел никаких попыток в любом месте, поэтому он может быть сложнее, чем я думаю.
Поочередно вы можете просто использовать SetItemData()
Чтобы сохранить int в каждом элементе и используйте это, чтобы индексировать Dict (или список, если элементы заказываются надежно и последовательно), которые содержат связанные объекты. TGRAY уже показал, как это сделать, и он перечислен на странице, а не ссылаться выше, поэтому я не буду проходить через него снова.