我遇到了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
但是我仍然遇到重叠的问题。
答案 0 :(得分:0)
如果你有很多小部件,你可以将ID存储在列表中并销毁每个小部件,或者将它们放在一个新的框架中并每次销毁框架,这也删除了对小部件的引用& #39; s。就个人而言,我会重复使用一个查询的所有结果的标签,即将文本变量附加到每个查询,然后将textvariable设置为每个找到的记录的新值,或者#34;&#34;如果是空的有关标签的textvariable选项的信息,请参阅http://effbot.org/tkinterbook/label.htm。
def next_set_of_recs():
print "next set"
old_frame.destroy()
top = tk.Tk()
tk.Label(top, text="not in created frame").grid()
old_frame=tk.Frame(top)
old_frame.grid(row=1)
tk.Label(old_frame, text="a_label", width=50).grid()
## give it some time, otherwise it is instantly destroyed
top.after(2000, next_set_of_recs)
top.mainloop()