2016-03-25 4 views
3

Ich versuche, die Ausgabe einer SparQL-Abfrage (via rdflib) in eine Listbox in einer Tkinter-GUI einzufügen. Die aktuelle Version des Codes ist:wie Tkinter eine Listbox von der Listeneingabe erzeugen kann

Button_4 = Button(self, text="Load object list", command=self.populateListbox) 
Button_4.grid(row=14, column=0, sticky=N) 

self.List_3 = Listbox(self, height=7, width=40, selectmode='single', exportselection=0) 
self.List_3.grid(row=15, column=0, sticky=N) 

    def populateListbox(self): 

    g=rdflib.Graph() 
    filename = r'bim\Perceel4.owl' 
    g.load(filename, format='xml') 
    Layer = u'Asfaltplak_onderlaag' 

    qres = g.query(
    """SELECT DISTINCT ?value ?name ?file ?frag 
     WHERE { 
      -- SparQL query for results-- 
       }""", 
    initNs=dict(
     cbim=Namespace("http://www.coinsweb.nl/cbim-1.1.owl#"))) 

    for row in qres: 
     if (rdflib.term.Literal(Layer, datatype=rdflib.term.URIRef(u'http://www.w3.org/2001/XMLSchema#string')) in row): 

     self.lst = row['file'] 

    self.List_3.insert("end",self.lst) 

Wenn ich drucken Sie die SPARQL-Abfrage mit dem Befehl: Druck: self.lst, erhalte ich die folgende Druckmeldung:

DTB HRB 166.495 - 166.038 VH_gml.xml 
DTB OPR 167.647 - 167.601 VH_gml.xml 
DTB PST 170.824 - 170.769 VH_gml.xml 
DTB HRB 166.038 - 164.169 VH_gml.xml 
DTB PST 167.696 - 167.767 VH_gml.xml 
...etc (more of these filenames) 

Wenn ich das Programm laufen und klicken Sie auf die Schaltfläche, um die Listbox zu füllen, ich bekomme nur einen Namen in der Listbox, nämlich den ersten der Liste. Wie kann ich die gesamte Liste in die Listbox einfügen, wie es zB der Druckbefehl ausgibt?

Ps. Ich versuchte, die ‚*‘ durch self.List_3.insert verwenden, aber das teilt nur den Namen in eine Liste, die aus dem Namen geplatzt, als solche („Ende“, selbst * lst.):

D 
T 
S 
1 
2 
..etc 

U pdate:

ich die Liste Split als solche hinzugefügt haben:

... 
     output = row['file'] 
     self.lst = output.split("\n") 

    self.List_3.insert("end",*self.lst) 

aber es immer noch gibt nur einen Listeneintrag im Listenfeld (die letzte in der Liste). Wenn ich self.lst in der neuen Einrichtung zu drucken, druckt es:

[u'DTB HRB 167.639 - 167.696 VH_gml.xml'] 
[u'DTB PST 167.134 - 167.274 VH_gml.xml'] 
[u'DTB HRB 166.038 - 164.169 VH_gml.xml'] 

... etc

+1

BTW, hat die Antwort Ihnen geholfen, Ihr Problem zu lösen, oder sind Sie immer noch Probleme? Wenn Sie sie noch haben, lassen Sie mich wissen, wo Sie stecken bleiben, damit ich mehr helfen kann. – Lafexlos

+0

Vielen Dank für Ihre Antwort! Ich konnte etwas mehr daran arbeiten, aber ich habe immer noch ein Problem. Ich habe die obige Frage aktualisiert! –

Antwort

3
import Tkinter as tk 

def populateListbox(lstt): 
    listbox.insert("end", *lstt) 

root = tk.Tk() 
listbox = tk.Listbox(root) 
listbox.pack() 
lst = ["one", "two", "three", "four"] 
btn = tk.Button(root, text="Populate listbox", command = lambda: populateListbox(lst)) 
btn.pack() 

root.mainloop() 

Dies ist die vereinfachte Version, wie Sie listbox mit einer Liste von Elementen bevölkern können. Wenn Sie in Ihrem Callback eine Liste erhalten, können Sie Lambda und Parameter entfernen, was zu so etwas führt.

def populateListbox(): 
    lst = [...] #gathered inside 
    listbox.insert("end", *lst) 

btn = tk.Button(..., command = populateListbox) 

Auch diejenigen return Aussage in selectOwl ist nutzlos, da es nichts, dass die Rückgabewerte zuzuordnen ist. Versuchen Sie, Ihren Wert in Ihrem Befehl zu verwenden, wenn sie benötigt werden.

Mit Blick auf die Bearbeitung scheint es, als ob alle Elemente in einer einzigen Zeichenfolge. Sie müssen sie durch etwas teilen. (Hier scheint es, als wäre es eine neue Zeile \n). .split() erstellt eine Liste, dann können Sie *lst Format verwenden.

outp = "DTB HRB 166.495 - 166.038 VH_gml.xml\nDTB OPR 167.647 - 167.601 VH_gml.xml\nDTB PST 170.824 - 170.769 VH_gml.xml" 

print outp 
DTB HRB 166.495 - 166.038 VH_gml.xml 
DTB OPR 167.647 - 167.601 VH_gml.xml 
DTB PST 170.824 - 170.769 VH_gml.xml 

lst = outp.split("\n") 

lst 
Out[5]: 
['DTB HRB 166.495 - 166.038 VH_gml.xml', 
'DTB OPR 167.647 - 167.601 VH_gml.xml', 
'DTB PST 170.824 - 170.769 VH_gml.xml'] 
+0

Vielen Dank für Ihre Antwort! Ich habe die Frage aktualisiert, da ich immer noch feststecke und meine Schuld nicht finden kann. –

+0

EDIT: Ich habe die Frage aktualisiert. I haben die Liste Split als solche hinzugefügt: ... output = row [ 'Datei'] = self.lst output.split ("\ n") self.List_3.insert ("end", * self.lst) aber es gibt nur einen Listeneintrag in der Listbox (der letzte der Liste). Wenn ich self.lst in der neuen Einrichtung drucke, druckt es: [u'DTB HRB 167.639 - 167.696 VH_gml.xml '] [u'DTB PST 167.134 - 167.274 VH_gml.xml '] [u'DTB HRB 166.038 - 164.169 VH_gml.xml'] ... usw. –

+0

Danke für die Antwort @Lafexlos! (Ich habe die BEARBEITUNG meiner Frage in ein Update eingefügt, da meine vorherigen Antworten im Kommentarbereich nicht klar waren. –