ListCtrl - wxPython / Python - PullRequest
       14

ListCtrl - wxPython / Python

3 голосов
/ 17 апреля 2010

У меня вопрос: можем ли мы присвоить / привязать какое-либо значение к определенному элементу и скрыть это значение (или можем ли мы сделать то же самое другим способом).

Пример. Допустим, столбцы в 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:

"Название"

"Описание"

"Hiddendescription"

Итак, пользователь заполняет это textctrls и нажимает кнопку, чтобы создать элемент, и я в основном хочу только показать Имя и Описание и скрыть «Скрытое описание», но сделать это, чтобы я мог использовать его позже.

Извините, что объяснил более одного раза в этом посте, но я хочу убедиться, что вы понимаете, что я притворяюсь делать.

Ответы [ 4 ]

7 голосов
/ 17 апреля 2010

Вместо использования 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))

Тогда, когда вы захотите использовать свои дополнительные данные, вы можете просто найти нужный элемент в словаре, и ваши данные будут там.

4 голосов
/ 17 апреля 2010

wxListCtrl позволяет связать произвольные данные с элементом, который не будет отображаться - прочитайте документы для следующих методов:

SetItemData

GetItemData

FindItemData

Класс wxListItem также имеет методы GetData и SetData.

1 голос
/ 11 января 2012

wx.ListCtrl не позволяет связать объект python с элементом, как wx.TreeCtrl делает с его чрезвычайно полезным SetPyData() методом (и соответствующим GetPyData()).

Я не пробовалэто сам, но здесь есть код , который показывает, как создать класс для смешивания данных Python со списком.Хотя я признаю, мне не совсем понятно, как вы собираетесь его использовать.

Также возможно прямое наследование от wx.ListCtrl и добавление соответствующих методов, но я неЯ видел любые попытки сделать это где угодно, так что это может быть сложнее, чем я думаю.

В качестве альтернативы вы можете просто использовать SetItemData(), чтобы хранить int в каждом элементе, и использовать это int для индексации слова (илисписок, если элементы упорядочены надежно и последовательно), который содержит связанные объекты.tgray уже показал, как это сделать, и он также указан на странице, на которую я ссылаюсь выше, поэтому я больше не буду это обсуждать.

1 голос
/ 17 апреля 2010

Вы всегда можете установить ширину скрытого столбца на ноль, что может выполнить то, что вы хотите. Я только что попробовал это в программе C ++ (не-wx), и она работала нормально.

...