【问题标题】:Tkinter not updating labels properlyTkinter 没有正确更新标签
【发布时间】:2018-12-17 20:38:59
【问题描述】:

这是代码:

for row in results:
    ColumnCounter += 1
    id_list.append(row['ID'])
    #print(id_list)  # DEBUG
    tk.Label(DisplayWindow, text=str(RowCounter - 1), fg="black", font="none 8 bold").grid(row=RowCounter, column=ColumnCounter, sticky=W)
    ColumnCounter += 1
    firstname_list.append(row['FIRST_NAME'])
    #print(firstname_list)  # DEBUG
    tk.Label(DisplayWindow, text=firstname_list[ListCounter], fg="black", font="none 8 bold").grid(row=RowCounter, column=ColumnCounter, sticky=W)
    ColumnCounter += 1
    surname_list.append(row['SURNAME'])
    #print(surname_list)  # DEBUG
    tk.Label(DisplayWindow, text=surname_list[ListCounter], fg="black", font="none 8 bold").grid(row=RowCounter, column=ColumnCounter, sticky=W)
    ColumnCounter += 1
    username_list.append(row['USERNAME'])
    #print(username_list)  # DEBUG
    tk.Label(DisplayWindow, text=username_list[ListCounter], fg="black", font="none 8 bold").grid(row=RowCounter, column=ColumnCounter, sticky=W)
    ColumnCounter += 1
    email_list.append(row['EMAIL'])
    #print(email_list)  # DEBUG
    tk.Label(DisplayWindow, text=email_list[ListCounter], fg="black", font="none 8 bold").grid(row=RowCounter, column=ColumnCounter, sticky=W)
    tk.Button(DisplayWindow, text="Select Row", command=lambda CurrentValue=row: [SelectRow(CurrentValue['ID'], CurrentValue['FIRST_NAME'], CurrentValue['SURNAME'], CurrentValue['USERNAME'], CurrentValue['EMAIL']), DisplayWindow.destroy()]).grid(row=RowCounter, column=ColumnCounter + 1, sticky=E)

    RowCounter += 1
    ColumnCounter = -1
    ListCounter += 1

每次重新运行此 for 循环时,标签都不会正确更新其文本。它显示旧文本中的一半内容和新文本中的一半内容。我尝试在所有标签中用textvariable=SomeStringVariable_Name (StringVar) 替换文本,但同样的问题。我该如何解决这个问题?

(变量 results 是一个字典。更准确地说,它是一个 MySQL 数据库的 fetchall。)

【问题讨论】:

  • 你没有更新任何东西。您只需在旧的小部件之上创建新的小部件。

标签: python python-3.x for-loop tkinter label


【解决方案1】:

可以通过为label 分配背景颜色并将"sticky=W" 选项调整为"sticky=W+E" 来解决重叠问题。

这样,新背景将(延伸并)完全覆盖旧文本。

这是(我相信)您可能一直在寻求的一种可能的解决方案。以下是关于标签管理的一些建议,以更好地控制标签。

如果标签本身的信息没有更新:

将每个标签分配给一个变量。然后,每次循环运行时,使用widget.configure(option=value)更新信息

label_id_list.configure(text=str(RowCounter - 1))
label_firstname_list.configure(text=firstname_list[ListCounter])
label_surname_list.configure(text=surname_list[ListCounter])
label_username_list.configure(text=username_list[ListCounter])
label_email_list.configure(text=email_list[ListCounter])
button_email_list.configure(command=lambda CurrentValue=row: [SelectRow(CurrentValue['ID'], CurrentValue['FIRST_NAME'], CurrentValue['SURNAME'], CurrentValue['USERNAME'], CurrentValue['EMAIL']))

标签信息会更新;无需致电widget.grid()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    相关资源
    最近更新 更多