[英]More Issues with overlapping labels in Tkinter
我對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
但是,我仍然遇到重疊的問題。
如果您有許多小部件,則可以將ID存儲在一個列表中並銷毀每個ID,或者將它們放置在新框架中並每次銷毀該框架,這也將刪除其中的對小部件的引用。 就個人而言,我將為一個查詢的所有結果重用標簽,即為每個查詢附加一個textvariable,然后為找到的每個記錄將textvariable設置為新值;如果為空,則將其設置為“”。 有關標簽的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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.