2017-06-22 12 views
1

Je souhaite créer un ListCtrl wxpython. Ainsi, lorsque le bouton de recherche est cliqué, je reçois la liste comme cetteComment remplir wxpython LIstCtrl avec l'événement OnClick

[(7, u'GLUOCOSE', u'C6H1206'), (8, u'SUCROSE', u'C12H22O11')] 

Je veux remplir la listctrl avec la sortie ci-dessus. Je suis la méthode InsertStringItem, qui me retournera l'index de la ligne courante et le reste des colonnes sont remplis par la méthode SetStringItem() .Mais cela me donne TypeError: String ou Unicode de type required.Comment accomplir ceci?

def OnSearch(self, event):   
    placeholder = '?' 
    placeholders = ','.join(placeholder for unused in self.molecule_list) 
    query = 'SELECT * FROM MOLECULE WHERE MOL_NUMBER IN (%s)' % placeholders 
    cursor = self.conn.execute(query, self.molecule_list) 
    final = cursor.fetchall() 
    print final 
    for j in final: 
     index = self.list.InsertStringItem(sys.maxint, j[0]) 
     self.list.SetStringItem(index, 1, j[1]) 
     self.list.SetStringItem(index, 2, j[2]) 

Répondre

1

Vous itérez le curseur, plutôt que les données qui a été renvoyée dans la final variable. Intervertir à itérer en utilisant final

index = 0 
for j in final: 
    index = self.list.InsertStringItem(index, str(j[0])) 
    self.list.SetStringItem(index, 1, j[1]) 
    self.list.SetStringItem(index, 2, j[2]) 
    index +=1 

La meilleure façon est de faire en sorte que le ListCtrl a un style=wx.LC_REPORT puis utilisez Append.

for j in final: 
    self.list.Append((j[0],j[1],j[2],j[3])) 

j [n] est chaque élément dont vous avez besoin à partir des données pour le nombre d'éléments dans le ListCtrl. J'espère que cela à du sens.

Voici un exemple montrant les deux méthodes

import wx 
class MyForm(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, "Molecules") 
     panel = wx.Panel(self, wx.ID_ANY) 
     self.index = 0 
     self.list_ctrl = wx.ListCtrl(panel, size=(-1,100), 
         style=wx.LC_REPORT 
         ) 
     self.list_ctrl.InsertColumn(0, 'Number') 
     self.list_ctrl.InsertColumn(1, 'Element') 
     self.list_ctrl.InsertColumn(2, 'Make up') 

     btn = wx.Button(panel, label="Add data") 
     btn.Bind(wx.EVT_BUTTON, self.add_lines) 
     btn2 = wx.Button(panel, label="Append data") 
     btn2.Bind(wx.EVT_BUTTON, self.app_lines) 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.list_ctrl, 0, wx.ALL|wx.EXPAND, 5) 
     sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5) 
     sizer.Add(btn2, 0, wx.ALL|wx.CENTER, 5) 
     panel.SetSizer(sizer) 

    def add_lines(self, event): 
     data = [[7, 'GLUCOSE', 'C6H1206'],[8,'SUCROSE', 'C12H22O11']] 
     index = 0 
     for j in data: 
      self.list_ctrl.InsertStringItem(index, str(j[0])) 
      self.list_ctrl.SetStringItem(index, 1, j[1]) 
      self.list_ctrl.SetStringItem(index, 2, j[2]) 
      index += 1 
    def app_lines(self, event): 
     data = [[7, 'GLUCOSE', 'C6H1206'],[8,'SUCROSE', 'C12H22O11']] 
     for j in data: 
      self.list_ctrl.Append((j[0],j[1],j[2])) 

if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyForm() 
    frame.Show() 
    app.MainLoop() 
+0

Je suis la réponse, mais quand j'essaie cela en utilisant InsertStringItem qui me donne TypeError: String ou le type Unicode requis. et j'insère une chaîne –

+0

Sans pouvoir voir l'erreur ou le listctrl c'est difficile à dire mais la structure devrait être 'InsertStringItem (index, label, imageIndex = -1)'. Utiliser 'sys.maxint' pour chaque' index' est très WRONG. Essayez la méthode 'append', c'est plus simple. –

+0

Pour l'index, initialisez-le avant la boucle à zéro et incrémentez dans la boucle. Cela vous donne une chance de faire fonctionner ce code. –