Pergunta

Minha pergunta é se podemos atribuir/vincular algum valor a um determinado item e ocultar esse valor (ou se podemos fazer a mesma coisa de outra maneira).

Exemplo: digamos que as colunas no listctrl sejam "nome" e "descrição":

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

E quando eu adiciono um item, quero que eles mostrem o parâmetro de nome e a descrição:

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

Agora, o que eu quero fazer é basicamente atribuir algo a esse item que não é mostrado para que eu possa acessar mais adiante no aplicativo.

Então, eu gostaria de adicionar algo que não é mostrado no aplicativo, mas está no valor do item como:

hiddendescription = "Somerandomthing"

Ainda não me destaca? Bem, digamos que eu adicione um botão para adicionar um item com alguns outros textctrls para definir os parâmetros e os parâmetros textctrls são:

"Nome"

"Descrição"

"Hiddendescription"

Então, o usuário preenche este texto e clica no botão para criar o item, e eu basicamente quero apenas mostrar o nome e a descrição e ocultar o "Hiddendescription", mas para fazê -lo para que eu possa usá -lo mais tarde.

Desculpe por explicar mais de uma vez neste post, mas quero ter certeza de que você entende o que pretendo fazer.

Foi útil?

Solução

O WXLISTCTRL permite associar dados arbitrários a um item, que não serão exibidos - leia os documentos para os seguintes métodos:

SetItemdata

GetItemdata

FindItEmdata

A classe WXListItem também possui métodos GetData e SetData.

Outras dicas

Em vez de usar o listctrl como estrutura de dados, você pode manter uma lista/dicto separado de objetos que contêm todas as informações desejadas e atualize o listctrl da sua outra estrutura de dados.

Por exemplo:

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

Então, em seu aplicativo:

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

Então, quando você deseja usar seus dados adicionais, basta procurar o item correto no dicionário e seus dados estarão lá.

Você sempre pode definir a largura da coluna oculta como zero, que pode realizar o que deseja. Acabei de experimentar em um programa C ++ (não-WX) e funcionou bem.

wx.ListCtrl não permite que você associe um objeto Python a um item como wx.TreeCtrl faz com o seu extremamente útil SetPyData() método (e correspondente GetPyData()).

Eu não tentei sozinho, mas há código aqui Isso mostra como criar uma classe para misturar dados python com uma lista. Embora eu admita, não está claro para mim como você deve usá -lo.

Também pode ser possível herdar diretamente do wx.listctrl e adicionar os métodos apropriados, mas não vi nenhuma tentativa nisso em nenhum lugar, por isso pode ser mais difícil do que estou pensando.

Alternadamente você pode simplesmente usar SetItemData() Para armazenar um INT em cada item e usar esse int para indexar um ditado (ou lista, se os itens forem ordenados de maneira confiável e consistente) que contêm os objetos associados. O TGRAY já mostrou como fazer isso e está listado na página que eu vincula acima também, para que não o repasse novamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top