2017-01-05 4 views
0

Ich bin ziemlich neu in Python und ich würde gerne eine SingleChoiceDialog Box mit einer Liste von Zeichenfolgen aus einer SQLite-Abfrage zeigen, aber ich mache etwas falsch und die Liste in der Box zeigt nur die letzte des Wertes der Variablenliste.Wie man richtig wx.SingleChoice in Python verwendet

Die Abfrage:

  sql = u"select person.name from person" 
      c.execute(sql) 
      for row in c.execute(sql): 
        z = list(row) 

Der Dialog:

 def whatusr(parent=None, message='', default_value=''): 
       dlg = wx.SingleChoiceDialog(
         self, "Who?", 'The Caption', 
         z, 
         wx.CHOICEDLG_STYLE 
         ) 
       if dlg.ShowModal() == wx.ID_OK: 
         print 'You selected: %s\n' % dlg.GetStringSelection() 
       dlg.Destroy() 

Als ich dies ausführen, wird das Dialogfeld zeigt nur den letzten Wert der Liste und nicht die ganze Liste. Ich denke, das ist, weil das Dialogfeld möchte, dass ich eine andere Form der Liste habe. Meine Liste z = list(row) gibt den Wert als: [a], [b], [c], .. aus, aber das Dialogfeld erwartet wahrscheinlich den Wert in diesem Formular: [a,b,c, ..]. Kann mir jemand helfen? Vielen Dank.

Antwort

0

Eine einfache Möglichkeit, dies zu erreichen, besteht darin, Ihre Liste aus der zurückgegebenen SQL-Anweisung zu erstellen, wobei nur das erste Element, d. H. Element [0], verwendet wird.

import sqlite3 
import wx 
db = sqlite3.connect('/home/rolf/my.db',) 
cur=db.cursor() 
cur.execute('person.name from person') 
stats = cur.fetchall() 
def xApp(): 
    z=[] 
    for i in stats: 
     z.append(i[0]) 
    dlg = wx.SingleChoiceDialog(None,"Which","title",z,wx.CHOICEDLG_STYLE) 
    if dlg.ShowModal() == wx.ID_OK: 
     print 'You selected: %s\n' % dlg.GetStringSelection() 
    dlg.Destroy() 
x=wx.App() 
xApp() 
x.MainLoop() 

oder könnten Sie verwenden:

z = [item[0] for item in stats] 

wie von Mike Driscoll erwähnt, aber Sie müssen nur noch das erste Element

+0

Thx! z = [] für i in Statistik: z.append (i [0]) Arbeitete für mich. – jailolous

0

Das Widget wx.SingleChoiceDialog erfordert tatsächlich eine normale Liste in Form von [a,b,c, ..], wie Sie vermutet haben. Was Sie wahrscheinlich bekommen, ist eine Liste von Listen und das Widget weiß nicht, wie man das richtig anzeigt.

Ich würde einfach eine list comprehension verwenden, um die Elemente aus der Zeile zu extrahieren. So etwas sollte funktionieren:

z = [item for item in row] 

Ich hoffe, das hilft.

Verwandte Themen