2016-03-25 101 views
3

我試圖將SparQL查詢的輸出(通過rdflib)插入到Tkinter GUI的列表框中。代碼的當前版本是:如何讓Tkinter從列表輸入中生成列表框

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) 

如果我使用命令打印SPARQL查詢:打印:self.lst,我得到以下打印消息:

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) 

當我運行程序並點擊按鈕來填充列表框,我只在列表框中獲得一個名字,即列表中的第一個。我怎樣才能得到列表框中插入的整個列表,如它出來的打印命令?

Ps。我用self.List_3.insert嘗試了「*」,但只拆分名成由名字分裂的名單,因爲這樣(「結束」,自* LST):

D 
T 
S 
1 
2 
..etc 

üPDATE:

我已經加入列表拆分爲這樣:

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

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

,但它仍然只給在ListBox(列表中的最後一個)一個列表條目。如果我在新設置印刷self.lst,它打印:

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

...等

+1

順便說一句,答案有幫助你解決你的問題,還是你仍然存在問題?如果你仍然有他們,讓我知道你在哪裏卡住,所以我可以幫助更多。 – Lafexlos

+0

謝謝您的回覆!我已經能夠做更多的工作,但我仍然有問題。我已經更新了上面的問題! –

回答

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

這是你如何填充列表框與項目列表中的簡化版本。如果你在回調中獲得列表,你可以刪除lambda和參數導致這樣的事情。

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

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

此外,在selectOwl那些return說法是無用的,因爲沒有什麼可分配一個返回值。如果需要,嘗試在你的命令中使用你的價值。

看着編輯,它看​​起來像是一個字符串中的所有項目。你需要把它們分開。 (在這裏它好像是新行\n)。 .split()將創建一個列表,然後您可以使用*lst格式。

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

謝謝你的回覆!我已經更新了這個問題,因爲我仍然陷入困境,找不到我的錯。 –

+0

編輯:我已經更新了這個問題。 我已經加入該列表分割爲這樣: ... 輸出=行[ '文件'] self.lst = output.split( 「\ n」 個) self.List_3.insert( 「結束」, * self.lst) 但它仍然只給列表框中的一個列表條目(最後一個列表)。如果我在新設置中打印self.lst,它將打印: [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'] ...等 –

+0

感謝您的回覆@Lafexlos! (我已經在更新中插入了我的問題的編輯,因爲我之前的回覆在評論部分中並不十分清楚。 –