【问题标题】:how to allow Tkinter to generate a listbox from list input如何允许 Tkinter 从列表输入生成列表框
【发布时间】:2016-07-13 02:23:21
【问题描述】:

我正在尝试将 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 查询:print: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)

当我运行程序并单击按钮填充列表框时,我在列表框中只得到一个名称,即列表的第一个。如何将整个列表插入到列表框中,例如打印命令出来的?

附言。我通过使用 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']

...等

【问题讨论】:

  • 顺便说一句,这个答案是否帮助您解决了您的问题,还是您仍然遇到问题?如果您还有它们,请告诉我您遇到的问题,以便我提供更多帮助。
  • 感谢您的回复!我已经能够再做一些工作,但我仍然有问题。我已经更新了上面的问题!

标签: python user-interface tkinter listbox sparql


【解决方案1】:
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']

【讨论】:

  • 感谢您的回复!我已经更新了这个问题,因为我仍然卡住并且找不到我的错。
  • 编辑:我已经更新了这个问题。我已经添加了列表拆分: ... 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'] ...等
  • 感谢@Lafexlos 的回复! (我在更新中插入了我的问题的编辑,因为我之前的回复在评论部分不是很清楚。
  • @RubenvanderHeijden 当您尝试打印时,您将打印语句放在哪里?在if 的内部还是for 的末尾?另外,你能不能试着把insert移到if下面?
  • 非常感谢@Lafexlos!将插件移到 if 解决了问题!祝你有美好的一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 2018-01-20
  • 1970-01-01
  • 2019-06-29
相关资源
最近更新 更多