Domanda

La mia domanda è se siamo in grado di assegnare / bind un certo valore ad un determinato articolo e nascondere tale valore (o se siamo in grado di fare la stessa cosa in un altro modo).

Esempio: Diciamo le colonne ListCtrl sono "Nome" e "Descrizione":

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

E quando aggiungo un elemento che voglio loro di mostrare il parametro Name e la descrizione:

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

Ora quello che voglio fare è fondamentalmente assegnare qualcosa a tale elemento che non viene mostrato in modo da poter accedere in seguito l'applicazione.

Quindi vorrei aggiungere qualcosa che non è visualizzato sul app, ma è sul valore oggetto simile a:

hiddendescription = "Somerandomthing"

ancora non ha undestand? Beh consente di dire aggiungo un pulsante per aggiungere un elemento con alcuni altri TextCtrls per impostare i parametri e le TextCtrls parametri sono:

"Nome"

"Descrizione"

"Hiddendescription"

Ecco che allora l'utente compila questo textctrls fuori e fa clic sul pulsante per creare la voce, e io in fondo vuole solo mostrare il nome e la descrizione e nascondere il "HiddenDescription", ma farlo in modo da poter utilizzare in seguito.

Ci scusiamo per spiegare più di 1 volta su questo post, ma voglio essere sicuri di capire quello che faccio finta di fare.

È stato utile?

Soluzione

il wxListCtrl consente di associare dati arbitrari con un elemento, che non verrà visualizzato - leggere la documentazione per i seguenti metodi:

SetItemData

GetItemData

FindItemData

La classe wxListItem ha anche metodi GetData e SetData.

Altri suggerimenti

Invece di usare il ListCtrl come struttura di dati, è possibile mantenere una lista / dict separata di oggetti che contengono tutte le informazioni che si desidera e aggiornare la ListCtrl dalla vostra altra struttura dati.

Ad esempio:

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

Quindi nella vostra applicazione:

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

Poi, quando si desidera utilizzare i dati aggiuntivi si può solo guardare la voce corretta nel dizionario ei dati ci sarà.

Si può sempre impostare la larghezza della colonna nascosta a zero, che potrebbero compiere ciò che si desidera. Ho appena provato in un programma (non-WX) C ++ e ha funzionato bene.

wx.ListCtrl non consente di associare un oggetto pitone con un oggetto simile a wx.TreeCtrl fa con il suo metodo SetPyData() estremamente utile (e corrispondenti GetPyData()).

Non ho provato io stesso, ma c'è qui che mostra come creare una classe di mescolare nei dati di pitone con una lista. Anche se devo ammettere, non è chiaro a me come sei destinato ad usarlo.

Si potrebbe anche essere possibile direttamente ereditare da wx.ListCtrl, e aggiungere i metodi appropriati, ma non ho visto qualsiasi tentativo di che ovunque, quindi potrebbe essere più difficile di quanto sto pensando.

In alternativa si può semplicemente utilizzare SetItemData() per memorizzare un int in ciascuna voce, e l'uso che int indicizzare un dict (o di un elenco, se gli articoli sono ordinate in modo affidabile e coerente) che contiene gli oggetti associati. tgray ha già mostrato come fare questo, ed è quotata alla pagina I link qui sopra e, quindi non andrò su di esso di nuovo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top