2015-11-12 268 views
0

我在使用Tkinter的GUI中构建一个Python的schedulemaker。Tkinter标签覆盖:更新或刷新?

我基本上有和this question一样的问题:日程表上的标签不被替换;另一个是最重要的。但是由于我动态地创建了表格,我没有标签的变量名称。

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

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): 
     Label(ScheduleFrame, text=stafflist[r-1].name).grid(row=r, column=0) 

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

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

#Mouse events 
def mouse(event): 
    y = event.widget.grid_info()['row'] - 1 
    x = event.widget.grid_info()['column'] - 1 
    print(x,y) 
    shiftSelection(y,x) 

#shiftSelection 
def shiftSelection(row, column): 
    shifts_window = Tk() 
    box = Listbox(shifts_window) 
    box.insert(1, "MR") 
    box.insert(2, "AR") 
    box.insert(3, "ER") 
    box.pack() 
    button = Button(shifts_window, text="Okay", command = lambda: selectShift(shifts_window, box.get(ACTIVE),row, column)) 
    button.pack() 

def selectShift(shifts_window, shift,row, column): 
    scheduleDictionary[row][column] = shift 
    BuildSchedule() 
    shifts_window.destroy() 

root.bind("<Button-1>", mouse) 

BuildSchedule() 

root.mainloop() 

回答

0

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

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

#(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") 
+0

谢谢,这工作!我在想的关键是使用元组来获取变量中的行和列信息。 – Bob

-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() 微小的变化,只是命名每个变量,你可以改变它,如果你想。

+0

您的更改不是很有用。你只需要覆盖变量'abcd' 4次,'efgh' 15次,'ijkl' 60次。最后,你只有三个变量来表示所有的小部件。 –