簡體   English   中英

Tkinter中標簽重疊的更多問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM