Pregunta

Mi pregunta es si podemos asignar / vinculación algún valor para un determinado tema y ocultar ese valor (o si podemos hacer lo mismo de otra manera).

Ejemplo: Digamos que las columnas de ListCtrl son "Nombre" y "Descripción":

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

Y cuando agrego un elemento Quiero que muestran el parámetro de nombre y la descripción:

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

Ahora lo que quiero hacer es básicamente asignar algo a ese elemento que no se muestra para que pueda acceder más adelante en la aplicación.

Así que me gustaría añadir algo que no se muestra en la aplicación, pero es en el valor del artículo como:

hiddendescription = "Somerandomthing"

Todavía no lo hizo undestand? Bueno digamos que añadir un botón para añadir un elemento con algunas otras TextCtrls para establecer los parámetros y los TextCtrls parámetros son:

"Nombre"

"Descripción"

"Hiddendescription"

Con esto, el usuario rellena este textctrls fuera y hace clic en el botón para crear el elemento, y yo, básicamente, sólo quieren mostrar el nombre y la descripción y ocultar el "HiddenDescription", pero hacerlo para que pueda usarlo más tarde.

Lo siento por explicar más de 1 vez en este post pero yo quiero para asegurarse de que entiende lo que pretendo hacer.

¿Fue útil?

Solución

la wxListCtrl permite asociar datos arbitrarios con un elemento, que no se mostrará - leer la documentación de los métodos siguientes:

SetItemData

GetItemData

FindItemData

La clase wxListItem también tiene métodos GetData y SetData.

Otros consejos

En lugar de utilizar el ListCtrl como su estructura de datos, se puede mantener una lista / dict separada de objetos que contienen toda la información que desee y actualizar la ListCtrl de su otra estructura de datos.

Por ejemplo:

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

A continuación, en la aplicación:

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

A continuación, cuando se quiere utilizar sus datos adicionales que puede simplemente mirar hacia arriba el artículo correcto en el diccionario y sus datos estará allí.

Siempre se puede ajustar el ancho de la columna oculta a cero, que podría lograr lo que desea. Yo sólo lo probé en un programa (no wx) C ++ y funcionó bien.

wx.ListCtrl no permite que se asocia un objeto de Python con un artículo como wx.TreeCtrl hace con su método SetPyData() extremadamente útil (y la correspondiente GetPyData()).

No he probado a mí mismo, pero no es aquí que muestra cómo crear una clase de mezclar en los datos de pitón con una lista. Aunque lo admito, no es claro cómo estás destinado a usarlo.

También podría ser posible heredar directamente de wx.ListCtrl, y añadir los métodos apropiados, pero no he visto cualquier intento de que en cualquier lugar, lo que puede ser más difícil de lo que estoy pensando.

Como alternativa se puede utilizar sólo SetItemData() para almacenar un entero en cada elemento, y el uso que int para indexar un diccionario (o lista, si los artículos se ordenan de forma fiable y consistente) que contiene los objetos asociados. tgray ya ha demostrado cómo hacer esto, y se enumeran en la página que enlace de arriba, así que no voy a ir sobre ella de nuevo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top