如何允许 Tkinter 从列表输入生成列表框

how to allow Tkinter to generate a listbox from list input

我正在尝试将 SparQL 查询的输出(通过 rdflib)插入到 Tkinter GUI 的列表框中。当前代码版本为:

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("end",self.*lst) 尝试了 '*',但这只会将名称拆分为由名称拆分组成的列表,例如:

D
T
S
1
2
..etc

更新:

我添加了这样的列表拆分:

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

    self.List_3.insert("end",*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']

...等等

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 语句是无用的,因为没有任何东西可以分配 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']