有关Tkinter中重叠标签的更多问题

时间:2014-12-01 22:18:16

标签: python python-2.7 user-interface tkinter label

我遇到了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

但是我仍然遇到重叠的问题。

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()