2017-03-13 20 views
0

Ich habe ein Stück Code, der ein Root-Element und ein Wörterbuch (einer variablen Größe) erhält und mit diesem Wörterbuch Reihen von 2 Etiketten Schlüssel, Wert Paare des Wörterbuchs erstellt.Mehrere dynamisch erstellte Labels wiederherstellen

Der Code funktioniert, aber wenn ich die Funktion mit verschiedenen Wörterbüchern aufruft, werden die Beschriftungen über die alten gesetzt, was es schlecht aussehen lässt und keine Ersatzzeilen löscht (zB hatte ich 10 Zeilen im letzten Wörterbuch) und in der aktuellen habe ich nur 5).

Ich habe versucht, es irgendwie in Listen zu setzen, um die Etiketten am Anfang der Methode zu zerstören, aber es funktioniert nicht.

Mein Versuch:

def dict_to_frame(self, root, dic): 
    if self.labels_col_list is not None: 
     for i, value in enumerate(self.labels_col_list): 
      if value is not None: 
       value.destroy() 
       self.labels_val_list[i].destroy() 
    curr_row = 3 
    str_var_col_list = [] 
    str_var_val_list = [] 
    self.labels_col_list = [] 
    self.labels_val_list = [] 

    for col, val in dic.iteritems(): 
     if val is None: 
      val = "Empty" 
     s1 = StringVar() 
     s1.set(col+": ") 
     str_var_col_list.append(s1) 
     s2 = StringVar() 
     s2.set(val) 
     str_var_val_list.append(s2) 

     self.labels_col_list.append(None) 
     self.labels_val_list.append(None) 
    for i, value in enumerate(str_var_col_list): 
     self.labels_col_list[i] = Label(root, textvariable=value).grid(column=1, row=curr_row, padx=5, pady=5) 
     self.labels_val_list[i] = Label(root, textvariable=str_var_val_list[i]).grid(column=2, row=curr_row, padx=5, pady=5) 
     curr_row += 1 

Wie kann ich es lösen? Und gibt es eine bessere Möglichkeit, dynamische Etiketten zu erstellen?

Antwort

0

Die absolut einfachste Lösung besteht darin, die Etiketten in einen Rahmen zu legen, der nur diese Etiketten enthält. Sie können den Rahmen zerstören und es wird alle Etiketten für Sie zerstören. Wenn dies statische Daten sind, gibt es keinen Grund, StringVar s zu verwenden.

+0

In der Tat eine einfache Lösung, die funktioniert super :) Danke! – Jonathan

Verwandte Themen