【发布时间】:2014-12-01 22:18:15
【问题描述】:
我在使用 Tkinter 时遇到问题。问题如下。
我从数据库中检索信息。我希望根据一些用户选择打印出来。 有时我想打印出 A、B、C 列 有时我想打印列 A、B、C、D 有时我想打印出 A、B、D、E 列
另外,当我查询时,我不知道提前会有多少结果。有些查询给出 1。有些给出 200。要打印它们,我会这样做......
while x < results.num_rows() :
result = results.fetch_row()
author = result[0][0]
title = result[0][1]
conference = result[0][2]
year = result[0][3]
location = result[0][4]
Label(root, text=title).grid(row=startRow,column=0,columnspan=5,sticky=W)
Label(root,text=author).grid(row=startRow,column=6,columnspan=1,sticky=W)
Label(root,text=year).grid(row=startRow,column=7,columnspan=1,sticky=W)
Label(root,text=conference).grid(row=startRow,column=8,columnspan=1,sticky=W)
Label(root,text=location).grid(row=startRow,column=9,columnspan=1,sticky=W)
startRow+=1
x+=1
这完成了我想要的。我在每个项目的前一个下方打印了一个标签。它打印所需的列(在本例中为标题、作者、年份、会议、位置)。有时它不同。一切都很好。
直到我的用户执行另一个查询。我无法删除以前的标签。我没有提及他们。我无法参考它们,因为我不知道我需要多少。标签的数量取决于用户想要的查询以及数据库中的匹配条目。
因此,当用户进行第二次或第三次查询时,结果开始打印在另一个之上。
我能做什么?
编辑 - 这是尝试。我在
中添加 try :
for item in labelList :
item.grid_forget()
except :
pass
我把它放在按钮代码的开头,这样如果 labelList 已经存在,它将在每次查询时执行此操作。如果它不存在,它就会过去。
while x < results.num_rows() :
result = results.fetch_row()
title = result[0][0]
conference = result[0][1]
year = result[0][2]
location = result[0][3]
message = title + "\t\t\t\t\t" + conference + "\t" + str(year) + "\t" + location
label = Label(root, text=title)
label.grid(row=startRow, column=0, columnspan=5,sticky=W)
labelList.append(label)
label = Label(root, text=conference)
label.grid(row=startRow, column=6, columnspan=1,sticky=W)
labelList.append( label )
label = Label(root, text=year)
label.grid(row=startRow, column=7, columnspan=1,sticky=W)
labelList.append( label )
label = Label(root, text=location)
label.grid(row=startRow, column=8, columnspan=1,sticky=W)
labelList.append( label )
startRow+=1
x+=1
但是我仍然遇到重叠问题。
【问题讨论】:
-
保留
list对Labels 的引用? -
不知道我会怎么做。每个标签都必须有一个唯一的名称,不是吗?我将如何即时生成该唯一名称?我想我可以做一些事情,比如有一个字符串“标签”并将它与“x”连接起来,我的迭代号。然后将所有这些存储在一个列表中。每次查询后,只需循环遍历列表和 grid_forget() 即可。你是这个意思吗?
-
不,为什么你认为他们必须有一个唯一的名字?只需
append列表中的对象;这可能是对它的唯一引用。 -
我会将数据网格化到一个框架中,而不是直接网格化到根目录中。或者考虑使用 ttk.Treeview 代替(如果有多个搜索键)。对于新查询,创建一个新框架(或树)并销毁旧框架。对于稍后的练习,将旧查询结果添加到用户可以返回的先前查询结果列表中。或者将每个查询结果放在 ttk.Notebook 的新选项卡中。 PS。 “20000”是指“200”还是“20000”?
-
搜索此站点。有几个例子。
标签: python python-2.7 user-interface tkinter label