Tkinter标签覆盖:更新还是刷新?

时间:2015-11-12 15:04:05

标签: python tkinter label

我正在使用Tkinter在GUI中使用GUI构建一个计划程序。

我基本上遇到与this question相同的问题:日程表上的标签不会被替换;另一个人名列前茅。但是,由于我动态创建表格,因此我没有标签的变量名称。

那么我还可以在没有变量名的情况下更新标签小部件的文本值吗? StringVar有没有办法做到这一点?或者我该如何正确刷新表格?

Matcher

2 个答案:

答案 0 :(得分:1)

解决方案是创建标签小部件一次,保存对每个小部件的引用,然后更改小部件而不是创建新的小部件。

由于您似乎正在构建类似于表的结构,因此使用(行,列)元组将小部件存储在字典中。例如:

#(Re)Build schedule on screen
def BuildSchedule():
    global widgets
    widgets = {}

    for r in range(1,4):
        label = Label(ScheduleFrame, text=stafflist[r-1].name)
        label.grid(row=r, column=0)
        widgets[(r,0)] = label

    for c in range(1,15):
        label = Label(ScheduleFrame, text=weekdays[(c-1)%7])
        label.grid(row=0, column=c)
        widgets[(0,c)] = label

    for r in range(1,4):
        for c in range(1,15):
            label = Label(ScheduleFrame, text=scheduleDictionary[r-1][c-1])
            label.grid(row=r, column=c)
            widgets[(r,c)] = label

稍后,您可以使用configure更改标签。例如,要更改第1行第10列的标签,您可以执行以下操作:

widgets[(1,10)].configure(text="the new text")

答案 1 :(得分:-1)

您应始终指定带有名称的标签,如果您想更改或更新标签的值,请使用config()

import tkinter
from tkinter import *

#DATA
class Staff(object):
    def __init__(self, name, ID):
        self.name = name #this data comes from storage
        self.ID = ID #this is for this instance, starting from 0 (for use with grid)

ID42 = Staff("Joe", 0)
ID25 = Staff("George", 1)
ID84 = Staff("Eva", 2)

stafflist = [ID42, ID25, ID84]
weekdays = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]

scheduleDictionary = {}

for r in range(0,3):
    scheduleDictionary[r] = ['shift','shift','shift','shift','shift','shift','shift','shift','shift','shift','shift','shift','shift','shift']

#Build window
root = Tk()

ScheduleFrame = Frame(root)
ScheduleFrame.pack()

#(Re)Build schedule on screen
def BuildSchedule():

    for r in range(1,4):
        abcd = tkinter.Label(ScheduleFrame, text=stafflist[r-1].name).grid(row=r, column=0)

    for c in range(1,15):
        efgh = tkinter.Label(ScheduleFrame, text=weekdays[(c-1)%7]).grid(row=0, column=c)

    for r in range(1,4):
        for c in range(1,15):
            ijkl = tkinter.Label(ScheduleFrame, text=scheduleDictionary[r-1][c-1]).grid(row=r, column=c)

如果您要更新标签,请使用config()set() 微小的更改,只需命名每个变量,您可以根据需要进行更改。