如何允许 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']
我正在尝试将 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']