2016-03-25 26 views
3

Bir SparQL sorgusunun çıktısını (rdflib aracılığıyla) bir Döşeme GUI'sindeki bir liste kutusuna yerleştirmeye çalışıyorum. kodun geçerli sürümü:Tkinter'ın liste girdisinden bir liste kutusu oluşturmasına nasıl izin verilir

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) 

Ben komutunu kullanarak SPARQL sorgusu yazdırırsanız: print: self.lst, aşağıdaki yazdırma mesajı alıyorum: Ben programı çalıştırdığınızda

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) 

ve liste kutusunu doldurmak için butona tıklayın, sadece liste kutusundan, yani listenin ilkinden bir isim alıyorum. Yazdırma komutunun çıktısı gibi liste kutusunun içine eklenen listenin tamamını nasıl alabilirim?

Ps. Ben (. * Lst öz, "son") self.List_3.insert kullanarak '*' denedi, ama bu sadece gibi, isim bölünmüş oluşur bir liste halinde isim böler:

D 
T 
S 
1 
2 
..etc 

U pdate: Ben gibi liste bölünmüş eklemiş

:

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

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

ama yine de sadece liste (listenin sonuncusu) bir liste girişi verir. Yeni kurulumunda self.lst baskı varsa, yazdırır:

[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'] 

... vb

+1

BTW, sorunun cevabını çözmenize yardımcı oldu mu, yoksa hala problem çözüyor musunuz? Eğer hala onlara sahipseniz, nerede takıldığını bana bildirin, bu yüzden daha fazla yardımcı olabilirim. – Lafexlos

+0

Cevabınız için teşekkür ederiz! Daha fazla çalışabildim ama hala bir problemim var. Yukarıdaki soruyu güncelledim! –

cevap

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

Bu öğelerin bir listesini listbox doldurmak nasıl basitleştirilmiş sürümüdür. Geri aramada liste alıyorsanız, lambda ve bunun gibi bir şeye yol açan parametreyi kaldırabilirsiniz. Bu getiri değerleri atamak için bir şey olmadığından

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

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

Ayrıca selectOwl olanlar return deyimi işe yaramaz. Gereksinim duyduğunuzda, değerinizi kendi komutunuzda kullanmayı deneyin.

Düzenlemeye bakıldığında, tek bir dizgedeki tüm öğeler gibi görünüyor. Onları bir şeyle bölmelisin. (Burada yeni hat \n gibi görünüyor). .split() bir liste oluşturacak ve *lst biçimini kullanabilirsiniz.

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

Cevabınız için teşekkür ederiz! Soruyu güncelledim çünkü hala takıldım ve benim hatamı bulamıyorum. –

+0

DÜZENLEME: Soruyu güncelledik. Böyle listesine bölünme ekledik: ... çıkış = satır [ 'Dosya'] self.lst = output.split ("\ n") self.List_3.insert ("son", * self.lst) ancak liste kutusunda yalnızca bir liste girişi (listenin sonuncusu) verir. Yeni kurulumda self.lst dosyasını yazdırırsam, [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'] ... vb cevapta @Lafexlos için –

+0

teşekkürler! (Benim önceki yanıt verir yorum bölümünde çok net değildi çünkü bir güncelleme benim soru EDIT taktınız. –