【问题标题】:More Issues with overlapping labels in TkinterTkinter 中重叠标签的更多问题
【发布时间】: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

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

【问题讨论】:

  • 保留listLabels 的引用?
  • 不知道我会怎么做。每个标签都必须有一个唯一的名称,不是吗?我将如何即时生成该唯一名称?我想我可以做一些事情,比如有一个字符串“标签”并将它与“x”连接起来,我的迭代号。然后将所有这些存储在一个列表中。每次查询后,只需循环遍历列表和 grid_forget() 即可。你是这个意思吗?
  • 不,为什么你认为他们必须有一个唯一的名字?只需append 列表中的对象;这可能是对它的唯一引用。
  • 我会将数据网格化到一个框架中,而不是直接网格化到根目录中。或者考虑使用 ttk.Treeview 代替(如果有多个搜索键)。对于新查询,创建一个新框架(或树)并销毁旧框架。对于稍后的练习,将旧查询结果添加到用户可以返回的先前查询结果列表中。或者将每个查询结果放在 ttk.Notebook 的新选项卡中。 PS。 “20000”是指“200”还是“20000”?
  • 搜索此站点。有几个例子。

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


【解决方案1】:

如果您有很多小部件,您可以将 ID 存储在一个列表中并销毁每个,或者将它们放在一个新框架中并每次销毁该框架,这也会删除对其中小部件的引用。就个人而言,我会为一个查询的所有结果重用标签,即为每个查询附加一个文本变量,然后将文本变量设置为找到的每条记录的新值,如果为空,则为“”。有关标签的 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()

【讨论】:

  • 为什么使用文本变量?这使对象的数量增加了一倍,但并没有真正为您买任何东西。它是一个更新文本变量的函数调用,它是一个重置标签上文本的函数调用
猜你喜欢
  • 2015-10-06
  • 2023-03-09
  • 2023-03-21
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多